select whole title on focus

master
koehr 5 years ago committed by Norman
parent 738dce4884
commit d079c8ae7a

@ -10,6 +10,7 @@
<section name="card-front" class="card-front"> <section name="card-front" class="card-front">
<header> <header>
<h1 :contenteditable="isSelection" <h1 :contenteditable="isSelection"
@focus="selectLine"
@blur="editField('name', $event)" @blur="editField('name', $event)"
@keypress.enter.prevent="editField('name', $event)"> @keypress.enter.prevent="editField('name', $event)">
{{ card.name }} {{ card.name }}
@ -32,6 +33,7 @@
import { Component, Prop, Vue } from 'vue-property-decorator' import { Component, Prop, Vue } from 'vue-property-decorator'
import { cardWHtoStyle, iconPath } from '@/lib' import { cardWHtoStyle, iconPath } from '@/lib'
import DeckCardEditor from '@/components/deck-card-editor.vue' import DeckCardEditor from '@/components/deck-card-editor.vue'
import { selectLine } from '@/editor'
@Component({ @Component({
components: { DeckCardEditor } components: { DeckCardEditor }
@ -102,6 +104,10 @@ export default class DeckCard extends Vue {
return style return style
} }
private selectLine () {
selectLine()
}
} }
</script> </script>

@ -1,19 +1,33 @@
function collapseRange (node: Node, toStart = false) { import { getFocussedNode } from './node'
function applyRange (callback: (range: Range) => void) {
const range = document.createRange() const range = document.createRange()
range.selectNode(node) callback(range)
range.collapse(toStart)
const sel = window.getSelection() const sel = window.getSelection()
if (sel) { if (sel) {
sel.removeAllRanges() sel.removeAllRanges()
sel.addRange(range) sel.addRange(range)
} }
} }
function collapseRange (node: Node, toStart = false) {
applyRange(range => {
range.selectNode(node)
range.collapse(toStart)
})
}
export function moveCaretToBOL () { export function moveCaretToBOL () {
const node = window.getSelection()?.focusNode const node = getFocussedNode()
if (node) collapseRange(node, true) if (node) collapseRange(node, true)
} }
export function moveCaretToEOL () { export function moveCaretToEOL () {
const node = window.getSelection()?.focusNode const node = getFocussedNode()
if (node) collapseRange(node, false) if (node) collapseRange(node, false)
} }
export function selectLine () {
const node = getFocussedNode()
if (node) {
applyRange(range => range.selectNodeContents(node))
}
}

@ -5,12 +5,14 @@ export {
isRootChild, isRootChild,
isElementNode, isElementNode,
isTextNode, isTextNode,
isEmptyTextNode isEmptyTextNode,
getFocussedNode
} from './node' } from './node'
export { export {
moveCaretToBOL, moveCaretToBOL,
moveCaretToEOL moveCaretToEOL,
selectLine
} from './caret' } from './caret'
export type State = KV<boolean> export type State = KV<boolean>

@ -1,5 +1,7 @@
const { TEXT_NODE, ELEMENT_NODE } = Node const { TEXT_NODE, ELEMENT_NODE } = Node
export function getFocussedNode (): Node | null {
return window.getSelection()?.focusNode || null
}
export function isTextNode ({ nodeType }: Node): boolean { export function isTextNode ({ nodeType }: Node): boolean {
return nodeType === TEXT_NODE return nodeType === TEXT_NODE
} }

Loading…
Cancel
Save