diff --git a/app/src/components/CardsLayer.vue b/app/src/components/CardsLayer.vue index a51c8f854ecbeefc0dae29c0f22a47f3835638d4..fd026244c76a16efc96afcac33d8a45d0700b205 100644 --- a/app/src/components/CardsLayer.vue +++ b/app/src/components/CardsLayer.vue @@ -1,128 +1,160 @@ <template> - <draggable @start="drag = true" @end="drag = false"> - <div v-for="(nodes, index) in $options.myArray" v-bind:key="index"> - <form class="nodes"> - <template v-if="nodes.read_mode == false"> - <textarea - @focus="editTrue(true)" - @blur="editTrue(false)" - autofocus - v-model="nodes.node_text" - @input="editNode" - :id="nodes.node_id" - ref="nodetext" - placeholder="Type your thoughts and ideas here! (auto saved every keystroke)" - ></textarea> - </template> - <template v-else> - <p - :id="nodes.node_id" - :inner-html.prop="nodes.node_text | marked" - ></p> - </template> - <div class="btn-row"> - <SvgButton - buttonClass="nodes" - @click.prevent="deleteFlag(nodes.node_id), updateNodes()" - /> - <SvgButton2 - buttonClass="nodes" - @click.prevent=" - readFlag(nodes.node_id, nodes.read_mode), updateNodes() - " - /> - </div> - - <div class="allemoji"> - <div - class="eachemoji" - v-for="(emojis, index) in configEmoji" - :key="index" - > - <template v-if="emojis.node_id == nodes.node_id">{{ - emojis.emoji_text - }}</template> + <div class="grid"> + <draggable + class="grid" + name="grid" + @start="drag = true" + @end="drag = false" + @update="nodePositionIndex" + > + <div v-for="(nodes, index) in $options.myArray" v-bind:key="index"> + <form + class="nodes cell" + :style="{ + backgroundColor: nodes.color, + }" + > + <template v-if="nodes.read_mode == false"> + <textarea + @focus="editTrue(true)" + @blur="editTrue(false)" + autofocus + v-model="nodes.node_text" + @input="editNode" + :id="nodes.node_id" + ref="nodetext" + placeholder="Type your thoughts and ideas here! (auto saved every keystroke)" + ></textarea> + </template> + <template v-else> + <p + :id="nodes.node_id" + :inner-html.prop="nodes.node_text | marked" + ></p> + </template> + <div class="btn-row"> + <SvgButton + buttonClass="nodes" + @click.prevent="deleteFlag(nodes.node_id), updateNodes()" + /> + <SvgButton2 + buttonClass="nodes" + @click.prevent=" + readFlag(nodes.node_id, nodes.read_mode), updateNodes() + " + /> + <v-swatches + v-model="color" + @input="chooseColor(color, nodes.node_id)" + :swatches="swatches" + :shapes="shapes" + show-border + show-fallback + fallback-input-type="color" + > + <SvgButton3 buttonClass="nodes" @click.prevent slot="trigger" /> + </v-swatches> </div> - </div> - </form> - </div> - <div - v-for="(othernodes, index) in othernodes_filtered" - v-bind:key="index.nodeid" - > - <div class="nodes"> - <p :inner-html.prop="othernodes.node_text | marked"></p> - - <div class="eeee"> - <input :value="othernodes.node_id" name="id" readonly hidden /> - <input - id="emojifield" - class="regular-input" - v-model="input" - readonly - /> - - <emoji-picker @emoji="append" :search="search"> + <div class="allemoji"> <div - class="emoji-invoker" - slot="emoji-invoker" - slot-scope="{ events: { click: clickEvent } }" - @click.stop="clickEvent" + class="eachemoji" + v-for="(emojis, index) in configEmoji" + :key="index" > - <svg - height="24" - viewBox="0 0 24 24" - width="24" - xmlns="http://www.w3.org/2000/svg" - > - <path d="M0 0h24v24H0z" fill="none" /> - <path - d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z" - /> - </svg> + <template v-if="emojis.node_id == nodes.node_id">{{ + emojis.emoji_text + }}</template> </div> - <div slot="emoji-picker" slot-scope="{ emojis, insert, display }"> + </div> + </form> + </div> + + <div + v-for="(othernodes, index) in othernodes_filtered" + v-bind:key="index.nodeid" + > + <div + class="othernodes cell" + :style="{ + backgroundColor: othernodes.color, + }" + > + <p :inner-html.prop="othernodes.node_text | marked"></p> + + <div class="eeee"> + <input :value="othernodes.node_id" name="id" readonly hidden /> + <input + id="emojifield" + class="regular-input" + v-model="input" + readonly + /> + + <emoji-picker @emoji="append" :search="search"> <div - class="emoji-picker" - :style="{ top: display.y + 'px', left: display.x + 'px' }" + class="emoji-invoker" + slot="emoji-invoker" + slot-scope="{ events: { click: clickEvent } }" + @click.stop="clickEvent" > - <div class="emoji-picker__search"> - <input type="text" v-model="search" /> - </div> - <div> - <div v-for="(emojiGroup, category) in emojis" :key="category"> - <h5>{{ category }}</h5> - <div class="emojis"> - <span - v-for="(emoji, emojiName) in emojiGroup" - :key="emojiName" - @click="insert(emoji), sentReact(othernodes.node_id)" - :title="emojiName" - >{{ emoji }}</span - > + <svg + height="24" + viewBox="0 0 24 24" + width="24" + xmlns="http://www.w3.org/2000/svg" + > + <path d="M0 0h24v24H0z" fill="none" /> + <path + d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z" + /> + </svg> + </div> + <div slot="emoji-picker" slot-scope="{ emojis, insert, display }"> + <div + class="emoji-picker" + :style="{ top: display.y + 'px', left: display.x + 'px' }" + > + <div class="emoji-picker__search"> + <input type="text" v-model="search" /> + </div> + <div> + <div + v-for="(emojiGroup, category) in emojis" + :key="category" + > + <h5>{{ category }}</h5> + <div class="emojis"> + <span + v-for="(emoji, emojiName) in emojiGroup" + :key="emojiName" + @click="insert(emoji), sentReact(othernodes.node_id)" + :title="emojiName" + >{{ emoji }}</span + > + </div> </div> </div> </div> </div> - </div> - </emoji-picker> + </emoji-picker> - <div class="allemoji"> - <div - class="eachemoji" - v-for="(emojis, index) in configEmoji" - :key="index" - > - <p v-if="othernodes.node_id == emojis.node_id"> - {{ emojis.emoji_text }} - </p> + <div class="allemoji"> + <div + class="eachemoji" + v-for="(emojis, index) in configEmoji" + :key="index" + > + <p v-if="othernodes.node_id == emojis.node_id"> + {{ emojis.emoji_text }} + </p> + </div> </div> </div> </div> </div> - </div> - </draggable> + </draggable> + </div> </template> <script> @@ -132,8 +164,13 @@ import draggable from 'vuedraggable' import EmojiPicker from 'vue-emoji-picker' import SvgButton from '@/components/SvgButton' import SvgButton2 from '@/components/SvgButton2' +import SvgButton3 from '@/components/SvgButton3' +import VSwatches from 'vue-swatches' +import 'vue-swatches/dist/vue-swatches.css' + var readmode var nodeid +var nodesort var emojitext export default { @@ -144,6 +181,16 @@ export default { }, data: function () { return { + color: '#9bc2d8', + shapes: 'circles', + + // swatches: [{ color: '#F493A7', showBorder: true }], + swatches: [ + ['#EB5757', '#F2994A', '#F2C94C'], + ['#219653', '#27AE60', '#6FCF97'], + ['#2F80ED', '#2D9CDB', '#56CCF2'], + ['#9B51E0', '#BB6BD9', '#E9B7FC'], + ], localreadmode: false, myArray: null, update: false, @@ -211,6 +258,20 @@ export default { }, methods: { + nodePositionIndex(e) { + console.log(e.newIndex) + // this index is where I came from so object + console.log(e.oldIndex) + + nodeid = e.item.firstChild.firstChild.id + nodesort = e.newIndex + this.$store.dispatch('sortNode', { nodeid, nodesort }) + }, + chooseColor(color, nodeid) { + this.$store.dispatch('colorNode', { nodeid, color }) + this.$options.myArray = this.nodes_filtered + }, + append(emoji) { this.input += emoji }, @@ -265,6 +326,8 @@ export default { components: { SvgButton, SvgButton2, + SvgButton3, + VSwatches, EmojiPicker, draggable, }, @@ -272,14 +335,38 @@ export default { </script> <style lang="css" scoped> -.grid { +/* .grid { display: flex; flex-wrap: wrap; +} */ + +.grid { + display: grid; + /* grid-template-columns: repeat(3, 350px); */ + /* grid-template-rows: repeat(3, 350px); */ + grid-gap: 0.2em; } + +.grid-move { + transition: all 0.3s; +} + .nodes { + padding: 0.5em 0.5em; min-width: 343px; - max-width: 343px; + /* max-width: 343px; */ border: 2px dashed black; + /* background-color: rgb(155, 194, 216); */ + margin-top: 1em; + margin-left: 0.5em; + margin-right: 0.5em; +} + +.othernodes { + padding: 0.5em 0.5em; + min-width: 343px; + /* max-width: 343px; */ + border: 2px solid black; background-color: rgb(155, 194, 216); margin-top: 1em; margin-left: 0.5em; @@ -313,8 +400,7 @@ textarea { display: flex; justify-content: center; flex-wrap: wrap; - padding: 0 15px; - border-radius: 4px; + padding: 0 25px; } .allemoji { @@ -427,4 +513,18 @@ input { padding-right: 0.5em; } } + +@media (min-width: 700px) { + .grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 1100px) { + .grid { + grid-template-columns: repeat(3, 1fr); + margin: 0 auto; + max-width: 1100px; + } +} </style> diff --git a/app/src/store/index.js b/app/src/store/index.js index 36e349c6f00e99d0789ae5f83366c033c8bddee4..f3adf1423b82f0c8951def1e6105e5324f0a24de 100644 --- a/app/src/store/index.js +++ b/app/src/store/index.js @@ -481,6 +481,7 @@ const store = new Vuex.Store({ height: 370, z_index: zindex, read_mode: false, + node_sort: 0, }) return pouchdb .put({ @@ -659,6 +660,38 @@ const store = new Vuex.Store({ }) }, + SORT_NODE(state, e) { + var i + for (i = 0; i < Object.keys(state.configPositions).length; i++) { + if (e.nodeid == state.configPositions[i].node_id) { + state.configPositions[i].node_sort = e.nodesort + } + } + pouchdb + .get(state.global_pos_name) + .then(function (doc) { + // // console.log(doc) + // put the store into pouchdb + return pouchdb.bulkDocs([ + { + _id: state.global_pos_name, + _rev: doc._rev, + positions: state.configPositions, + }, + ]) + }) + .then(function () { + return pouchdb.get(state.global_pos_name).then(function (doc) { + state.configPositions = doc.positions + }) + }) + .catch(function (err) { + if (err.status == 404) { + // pouchdb.put({ }) + } + }) + }, + LEGACY_READ_FLAG(state, e) { var i // console.log(e.e) @@ -795,6 +828,9 @@ const store = new Vuex.Store({ commit('MOVE_POS', nodeid, xpos, ypos, width, height, zindex) }, + sortNode: ({ commit }, e) => { + commit('SORT_NODE', e) + }, updateConnect: ({ commit }, fromnode, xposstart, yposstart) => { commit('UPDATE_CONNECT', fromnode, xposstart, yposstart) },