Skip to content

Commit f502ffe

Browse files
committed
save preference implementated
1 parent 3180f5c commit f502ffe

File tree

8 files changed

+121
-49
lines changed

8 files changed

+121
-49
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Interactive Data Editor
22
### <i>A Software to interactively edit data in a graphical manner.</i>
33

4-
[![Version](https://img.shields.io/badge/Version-2.12.1-brightgreen.svg)]()
4+
[![Version](https://img.shields.io/badge/Version-2.13.0-brightgreen.svg)]()
55
[![MIT License](https://img.shields.io/badge/License-MIT-brightgreen.svg)](https://github.com/Koushikphy/Interactive_Data_Editor/blob/master/LICENSE)
66
[![interactive-data-editor](https://snapcraft.io/interactive-data-editor/badge.svg)](https://snapcraft.io/interactive-data-editor)
77
[![interactive-data-editor](https://snapcraft.io/interactive-data-editor/trending.svg?name=0)](https://snapcraft.io/interactive-data-editor)

RELEASE.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## v2.13.0
2+
1. **Save Preference**: Specify which columns to write and what format to use.
3+
14
## v2.12.1
25
1. Bug with value swapping resolved.
36
2. Auto saving error fixed.

index.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,14 @@ const homeMenuTemplate = [
266266
mainWindow.webContents.send("menuTrigger", "saveas");
267267
}
268268
},
269+
{
270+
label: "Save Preference",
271+
enabled: false,
272+
id: 'savepref',
273+
click() {
274+
mainWindow.webContents.send("menuTrigger", "savepref");
275+
}
276+
},
269277
{
270278
label : "Export as image",
271279
click() {
@@ -329,7 +337,7 @@ const homeMenuTemplate = [
329337
if(mainWindow!=window) window.close()
330338
})
331339
var men = Menu.getApplicationMenu();
332-
for (let i of ['save', 'saveas', 'tfs','tpl', '3dview', "spr", 'af', 'arf', 'tax', 'swapen', "extend", "fill", "filter", 'rgfit', 'lmfit']) {
340+
for (let i of ['save', 'saveas', 'savepref', 'tfs','tpl', '3dview', "spr", 'af', 'arf', 'tax', 'swapen', "extend", "fill", "filter", 'rgfit', 'lmfit']) {
333341
men.getMenuItemById(i).enabled = false;
334342
}
335343
mainWindow.reload();

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"author": "Koushik Naskar <[email protected]>",
55
"copyright": "Copyright © January,2022 Koushik Naskar",
66
"homepage": "https://github.com/Koushikphy/Interactive-Data-Editor",
7-
"version": "2.12.1",
7+
"version": "2.13.0",
88
"main": "index.js",
99
"license": "MIT",
1010
"scripts": {

src/css/style.css

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -997,16 +997,8 @@ a:focus{
997997

998998

999999

1000-
.adSave{
1001-
display: grid;
1002-
grid-auto-flow: row;
1003-
grid-template-columns: repeat(2,max-content);
1004-
grid-template-rows: repeat(4,max-content);
1005-
grid-column-gap: .5em;
1006-
grid-row-gap: 0.3em;
1007-
1008-
1009-
1000+
#popSv{
1001+
padding: 0.1em 0.3em;font-size: 1.1em;margin-top: 0.5em;
10101002
}
10111003
#fixer > input[type="submit"]{
10121004
grid-row: span 2;

src/html/index.html

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -238,21 +238,34 @@
238238
</div>
239239

240240

241-
<!-- Advanced save popup
242-
<div id="popupSetVal" class="popup" style="display: block">
241+
<!-- Advanced save popup -->
242+
<div id="popAdSv" class="popup">
243243
<div class="title">
244244
<label class='titletxt'>Save Options</label>
245245
<b class='closbtn' title="Close">X</b>
246246
</div>
247-
<div class="popmain adSave">
248-
249-
<label title="Field delimiter to separate the values">Columns delimiter</label> <input type="text" id='saveDel' value="\t">
250-
<label title="Single or sequence of format">Save format</label> <input type="text" id='saveForm'>
251-
<label title="Which columns to store">Use columns</label> <input type="text" id='saveCol'>
252-
<label title="Any text to put at the top of the file">Header</label> <input type="text" id='saveHead'>
253-
247+
<div class="popmain" style="text-align: center;padding: 0.5em">
248+
<table>
249+
<thead>
250+
<tr>
251+
<th colspan="2" style="padding-right: 10px;">Use column</th>
252+
<th>Format</th>
253+
</tr>
254+
</thead>
255+
<tbody id="sBody"></tbody>
256+
</table>
257+
258+
<div style="text-align: left;margin-top: 0.3em;font-size: 0.75em;margin-bottom: 0.7em;">
259+
&#x1F6C8;<a title="Complete Format Specification" href='javascript:void(0);'
260+
style="text-decoration: underline;color: blue;font-style: italic;"
261+
onclick="shell.openExternal('https://docs.python.org/3/library/string.html#format-specification-mini-language')">Complete Format Specification</a>
262+
</div>
263+
<div>
264+
<input id="popSv"type="submit" value="Save">
265+
</div>
254266
</div>
255-
</div> -->
267+
268+
</div>
256269

257270

258271
<div id="branding">

src/js/functions.js

Lines changed: 79 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@ Plotly.newPlot(figurecontainer, [clone(iniPointsD)], clone(layout), {
2727
modeBarButtonsToAdd: [[{
2828
name: 'Save the image',
2929
icon: Plotly.Icons.camera,
30-
click() { document.getElementById('imRes').value = `${window.innerWidth}x${window.innerHeight}`;
31-
$('#popupEx').show()
32-
}
30+
click() {
31+
document.getElementById('imRes').value = `${window.innerWidth}x${window.innerHeight}`;
32+
$('#popupEx').show()
33+
}
3334
}]]
3435
});
3536
var points = figurecontainer.querySelector(".scatterlayer .trace:first-of-type .points").getElementsByTagName("path");
@@ -49,7 +50,7 @@ function setUpFor2d() {
4950
$('#yLabel').html('X')
5051
$('#zLabel').html('Y')
5152
col = store.get("cols2d", { x: 0, y: 0, z: 0, s: 0 })
52-
enableMenu(['save', 'saveas', 'tfs', 'tpl', "spr", 'swapen', "extend", "fill", "filter", 'af', 'arf', 'rgfit', 'lmfit', 'smooth', 'fixer'])
53+
enableMenu(['save', 'saveas', 'savepref', 'tfs', 'tpl', "spr", 'swapen', "extend", "fill", "filter", 'af', 'arf', 'rgfit', 'lmfit', 'smooth', 'fixer'])
5354
disableMenu(["tax", '3dview'])
5455
}
5556

@@ -60,7 +61,7 @@ function setUpFor3d() {
6061
$('#zLabel').html('Z')
6162
setUpSlider();
6263
col = store.get("cols3d", { x: 0, y: 0, z: 0, s: 0 })
63-
enableMenu(['save', 'saveas', 'tfs', 'tpl', "spr", 'swapen', "extend", "fill", "filter", 'af', 'arf', 'tax', '3dview', 'smooth', 'fixer'])
64+
enableMenu(['save', 'saveas', 'savepref', 'tfs', 'tpl', "spr", 'swapen', "extend", "fill", "filter", 'af', 'arf', 'tax', '3dview', 'smooth', 'fixer'])
6465
disableMenu(["rgfit", 'lmfit'])
6566
}
6667

@@ -143,7 +144,7 @@ function fileReader(fname) {
143144
swapped = 0; xName = "X"; saved = true, index = [], firstSave = true;
144145
undoRedo.reset()
145146
swapper.close();
146-
147+
147148
data = fileOpener(fname)
148149
is3D = data.length != 1;
149150

@@ -190,6 +191,7 @@ function fileReader(fname) {
190191
toolbarutil.closeToolBar()
191192
autoSaver.resetReminder()
192193
sidebar.buildSideBar()
194+
saveProp.reset()
193195
analytics.add('fileLoaded')
194196
}
195197

@@ -561,31 +563,37 @@ function saveAs() {
561563
}
562564

563565

564-
function parseSaveOption(){
565-
566-
getVal = (x) => document.getElementById(x).value.trim()
567-
568-
let delimiter = getVal("saveDel")
569-
let format = getVal("saveForm").split(',')
570-
let saveCols = getVal("saveCol").split(',')
571-
let saveHead = getVal("saveHead")
572-
let colLength = data[0].length
573-
574-
if(delimiter=="") delimiter ="\t"
575-
576-
if(format=="") format =".8g"
577-
if(format.length==1) format = new Array(colLength).fill(format)
578-
if(format.length!=1) alertElec("Format should be a single specifier or secifier for each column")
579-
580-
// if(saveCols=="")
566+
function saveData() {
567+
try {
568+
var formats = saveProp.formats.map(Plotly.d3.format)
569+
} catch (error) {
570+
alertElec("Invalid write format")
571+
}
581572

573+
var checkCol = []
574+
saveProp.checks.forEach((e, i) => {if (e) checkCol.push(i) })
582575

576+
try{
577+
var tmpData = swapped ? expRotate(data, col.y, col.x) : data
578+
var txt = tmpData.map(x => transpose(x).map(y =>
579+
checkCol.map(ind => formats[ind](y[ind])).join('\t')
580+
).join('\n')).join('\n\n')
583581

582+
fs.writeFileSync(saveNames[currentEditable], txt);
583+
showStatus("Data Saved in file " + replaceWithHome(saveNames[currentEditable]));
584+
saved = true;
585+
autoSaver.resetReminder()
586+
analytics.add('saved')
587+
} catch (error) {
588+
showStatus("Something went wrong! Couldn't save the data...")
589+
console.error(error)
590+
return false;
591+
}
584592
}
585593

586594

587595

588-
function saveData() {
596+
function saveData_old() {
589597
var tmpData = swapped ? expRotate(data, col.y, col.x) : data
590598
// https://www.npmjs.com/package/d3-format#locale_formatPrefix
591599
//^ using d3 format, `g` means decimal/exponent notation, rounded to significant digits
@@ -932,7 +940,7 @@ class Analytics {
932940
store.set('shown', shown + 1)
933941
// if (shown % 10 == 0) { // shown after every 10 opening
934942
// }
935-
if(shown==0){
943+
if (shown == 0) {
936944
setTimeout(() => {
937945
showInfo(
938946
"Note from developer !",
@@ -972,4 +980,49 @@ class Analytics {
972980
}
973981
}
974982

975-
const analytics = new Analytics()
983+
const analytics = new Analytics()
984+
985+
986+
class SaveProperties {
987+
// https://docs.python.org/3/library/string.html#format-specification-mini-language
988+
constructor() {
989+
}
990+
991+
reset() { // should load on every file load and also in every column change
992+
this.colLenght = data[0].length
993+
this.formats = new Array(this.colLenght).fill('.8g')
994+
this.checks = new Array(this.colLenght).fill(true)
995+
}
996+
997+
createui = () => { // reset on every file load
998+
document.getElementById('sBody').innerHTML = data[0].map((_, i) => `
999+
<tr>
1000+
<td> ${i + 1}. </td>
1001+
<td><input type="checkbox" class="sCheck" ${this.checks[i] ? 'checked' : ''}></td>
1002+
<td><input type="text" class="sFormat" value=${this.formats[i]}></td>
1003+
</tr>
1004+
`).join('')
1005+
$('#popAdSv').show()
1006+
document.getElementById('popSv').addEventListener('click', () => {
1007+
try {
1008+
this.getchecks()
1009+
this.getformat()
1010+
} catch (error) {
1011+
alertElec("Invalid write format")
1012+
}
1013+
$('#popAdSv').hide()
1014+
})
1015+
}
1016+
1017+
getchecks = () => {
1018+
var ts = $('tBody input:checkbox')
1019+
for (let i = 0; i < ts.length; i++) this.checks[i] = ts[i].checked ;
1020+
}
1021+
1022+
getformat = () => {
1023+
var ts = $('tBody input:text')
1024+
for (let i = 0; i < ts.length; i++) this.formats[i] = ts[i].value ;
1025+
}
1026+
}
1027+
1028+
const saveProp = new SaveProperties()

src/js/keyIpcTrigger.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ function ipcTrigger(_, d) {
143143
} else if (d == 'save' && !firstSave) {
144144
saveData()
145145

146+
} else if (d == 'savepref') {
147+
saveProp.createui()
148+
146149
} else if (d == '3dview') {
147150
viewer3D.open()
148151
analytics.add('3Dviewer')

0 commit comments

Comments
 (0)