mirror of
https://github.com/chinchang/web-maker.git
synced 2025-07-15 02:56:18 +02:00
wait for mode handling before preview refresh.
This commit is contained in:
@ -150,7 +150,6 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
} else {
|
} else {
|
||||||
options.sizes = [ 33.33, 33.33, 33.33 ];
|
options.sizes = [ 33.33, 33.33, 33.33 ];
|
||||||
}
|
}
|
||||||
utils.log('reset splitting', currentItem);
|
|
||||||
|
|
||||||
codeSplitInstance = Split(['#js-html-code', '#js-css-code', '#js-js-code'], options);
|
codeSplitInstance = Split(['#js-html-code', '#js-css-code', '#js-js-code'], options);
|
||||||
mainSplitInstance = Split(['#js-code-side', '#js-demo-side' ], {
|
mainSplitInstance = Split(['#js-code-side', '#js-demo-side' ], {
|
||||||
@ -428,7 +427,15 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
titleInput.value = currentItem.title || 'Untitled';
|
titleInput.value = currentItem.title || 'Untitled';
|
||||||
externalJsTextarea.value = (currentItem.externalLibs && currentItem.externalLibs.js) || '';
|
externalJsTextarea.value = (currentItem.externalLibs && currentItem.externalLibs.js) || '';
|
||||||
externalCssTextarea.value = (currentItem.externalLibs && currentItem.externalLibs.css) || '';
|
externalCssTextarea.value = (currentItem.externalLibs && currentItem.externalLibs.css) || '';
|
||||||
externalJsTextarea.dispatchEvent(new Event('change'));
|
// FIXME
|
||||||
|
// externalJsTextarea.dispatchEvent(new Event('change'));
|
||||||
|
|
||||||
|
utils.log('refresh editor')
|
||||||
|
// Set the modes manually here, so that the preview refresh triggered by the `setValue`
|
||||||
|
// statements below, operate on correct modes.
|
||||||
|
htmlMode = currentItem.htmlMode || prefs.htmlMode || HtmlModes.HTML;
|
||||||
|
cssMode = currentItem.cssMode || prefs.cssMode || CssModes.CSS;
|
||||||
|
jsMode = currentItem.jsMode || prefs.jsMode || JsModes.JS;
|
||||||
|
|
||||||
scope.cm.html.setValue(currentItem.html);
|
scope.cm.html.setValue(currentItem.html);
|
||||||
scope.cm.css.setValue(currentItem.css);
|
scope.cm.css.setValue(currentItem.css);
|
||||||
@ -437,9 +444,13 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
scope.cm.css.refresh();
|
scope.cm.css.refresh();
|
||||||
scope.cm.js.refresh();
|
scope.cm.js.refresh();
|
||||||
|
|
||||||
updateHtmlMode(currentItem.htmlMode || prefs.htmlMode || HtmlModes.HTML);
|
// Set preview only when all modes are updated so that preview doesn't generate on partially
|
||||||
updateJsMode(currentItem.jsMode || prefs.jsMode || JsModes.JS);
|
// correct modes and also doesn't happen 3 times.
|
||||||
updateCssMode(currentItem.cssMode || prefs.cssMode || CssModes.CSS);
|
Promise.all([
|
||||||
|
updateHtmlMode(htmlMode),
|
||||||
|
updateCssMode(cssMode),
|
||||||
|
updateJsMode(jsMode)
|
||||||
|
]).then(() => scope.setPreviewContent(true));
|
||||||
|
|
||||||
toggleLayout(currentItem.layoutMode || prefs.layoutMode);
|
toggleLayout(currentItem.layoutMode || prefs.layoutMode);
|
||||||
}
|
}
|
||||||
@ -459,10 +470,15 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
*/
|
*/
|
||||||
function handleModeRequirements(mode) {
|
function handleModeRequirements(mode) {
|
||||||
// Exit if already loaded
|
// Exit if already loaded
|
||||||
if (modes[mode].hasLoaded) { return; }
|
var d = deferred();
|
||||||
|
if (modes[mode].hasLoaded) {
|
||||||
|
d.resolve();
|
||||||
|
return d.promise;
|
||||||
|
}
|
||||||
|
|
||||||
function setLoadedFlag() {
|
function setLoadedFlag() {
|
||||||
modes[mode].hasLoaded = true;
|
modes[mode].hasLoaded = true;
|
||||||
|
d.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode === HtmlModes.JADE) {
|
if (mode === HtmlModes.JADE) {
|
||||||
@ -484,35 +500,34 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
loadJS('lib/babel.min.js').then(setLoadedFlag);
|
loadJS('lib/babel.min.js').then(setLoadedFlag);
|
||||||
} else if (mode === JsModes.TS) {
|
} else if (mode === JsModes.TS) {
|
||||||
loadJS('lib/typescript.js').then(setLoadedFlag);
|
loadJS('lib/typescript.js').then(setLoadedFlag);
|
||||||
|
} else {
|
||||||
|
d.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return d.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateHtmlMode(value) {
|
function updateHtmlMode(value) {
|
||||||
htmlMode = value;
|
htmlMode = value;
|
||||||
htmlModelLabel.textContent = modes[value].label;
|
htmlModelLabel.textContent = modes[value].label;
|
||||||
handleModeRequirements(value);
|
|
||||||
scope.cm.html.setOption('mode', modes[value].cmMode);
|
scope.cm.html.setOption('mode', modes[value].cmMode);
|
||||||
CodeMirror.autoLoadMode(scope.cm.html, modes[value].cmPath || modes[value].cmMode);
|
CodeMirror.autoLoadMode(scope.cm.html, modes[value].cmPath || modes[value].cmMode);
|
||||||
|
return handleModeRequirements(value);
|
||||||
}
|
}
|
||||||
function updateCssMode(value) {
|
function updateCssMode(value) {
|
||||||
cssMode = value;
|
cssMode = value;
|
||||||
cssModelLabel.textContent = modes[value].label;
|
cssModelLabel.textContent = modes[value].label;
|
||||||
handleModeRequirements(value);
|
|
||||||
scope.cm.css.setOption('mode', modes[value].cmMode);
|
scope.cm.css.setOption('mode', modes[value].cmMode);
|
||||||
CodeMirror.autoLoadMode(scope.cm.css, modes[value].cmPath || modes[value].cmMode);
|
CodeMirror.autoLoadMode(scope.cm.css, modes[value].cmPath || modes[value].cmMode);
|
||||||
|
return handleModeRequirements(value);
|
||||||
}
|
}
|
||||||
function updateJsMode(value) {
|
function updateJsMode(value) {
|
||||||
jsMode = value;
|
jsMode = value;
|
||||||
|
console.log('mode set', value)
|
||||||
jsModelLabel.textContent = modes[value].label;
|
jsModelLabel.textContent = modes[value].label;
|
||||||
handleModeRequirements(value);
|
|
||||||
scope.cm.js.setOption('mode', modes[value].cmMode);
|
scope.cm.js.setOption('mode', modes[value].cmMode);
|
||||||
CodeMirror.autoLoadMode(scope.cm.js, modes[value].cmPath || modes[value].cmMode);
|
CodeMirror.autoLoadMode(scope.cm.js, modes[value].cmPath || modes[value].cmMode);
|
||||||
// FIXME: Will be saved as part of scope settings
|
return handleModeRequirements(value);
|
||||||
/*
|
|
||||||
chrome.storage.sync.set({
|
|
||||||
jsMode: value
|
|
||||||
}, function () {});
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// computeHtml, computeCss & computeJs evaluate the final code according
|
// computeHtml, computeCss & computeJs evaluate the final code according
|
||||||
@ -525,7 +540,7 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
} else if (htmlMode === HtmlModes.MARKDOWN) {
|
} else if (htmlMode === HtmlModes.MARKDOWN) {
|
||||||
d.resolve(marked ? marked(code) : code);
|
d.resolve(marked ? marked(code) : code);
|
||||||
} else if (htmlMode === HtmlModes.JADE) {
|
} else if (htmlMode === HtmlModes.JADE) {
|
||||||
d.resolve(jade ? jade.render(code) : code);
|
d.resolve(window.jade ? jade.render(code) : code);
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.promise;
|
return d.promise;
|
||||||
@ -575,6 +590,10 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
var code = scope.cm.js.getValue();
|
var code = scope.cm.js.getValue();
|
||||||
|
|
||||||
cleanupErrors('js');
|
cleanupErrors('js');
|
||||||
|
if (!code) {
|
||||||
|
d.resolve('');
|
||||||
|
return d.promise;
|
||||||
|
}
|
||||||
var ast;
|
var ast;
|
||||||
|
|
||||||
if (jsMode === JsModes.JS) {
|
if (jsMode === JsModes.JS) {
|
||||||
@ -592,6 +611,10 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
}
|
}
|
||||||
} else if (jsMode === JsModes.COFFEESCRIPT) {
|
} else if (jsMode === JsModes.COFFEESCRIPT) {
|
||||||
var coffeeCode;
|
var coffeeCode;
|
||||||
|
if (!window.CoffeeScript) {
|
||||||
|
d.resolve('');
|
||||||
|
return d.promise;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
coffeeCode = CoffeeScript.compile(code, { bare: true });
|
coffeeCode = CoffeeScript.compile(code, { bare: true });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -606,6 +629,10 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
d.resolve(escodegen.generate(ast));
|
d.resolve(escodegen.generate(ast));
|
||||||
}
|
}
|
||||||
} else if (jsMode === JsModes.ES6) {
|
} else if (jsMode === JsModes.ES6) {
|
||||||
|
if (!window.Babel) {
|
||||||
|
d.resolve('');
|
||||||
|
return d.promise;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
ast = esprima.parse(code, {
|
ast = esprima.parse(code, {
|
||||||
tolerant: true,
|
tolerant: true,
|
||||||
@ -635,6 +662,10 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
}
|
}
|
||||||
} else if (jsMode === JsModes.TS) {
|
} else if (jsMode === JsModes.TS) {
|
||||||
try {
|
try {
|
||||||
|
if (!window.ts) {
|
||||||
|
d.resolve('');
|
||||||
|
return d.promise;
|
||||||
|
}
|
||||||
code = ts.transpileModule(code, { reportDiagnostics: true, compilerOptions: { noEmitOnError: true, diagnostics: true, module: ts.ModuleKind.ES2015 } });
|
code = ts.transpileModule(code, { reportDiagnostics: true, compilerOptions: { noEmitOnError: true, diagnostics: true, module: ts.ModuleKind.ES2015 } });
|
||||||
if (code.diagnostics.length) {
|
if (code.diagnostics.length) {
|
||||||
|
|
||||||
@ -768,11 +799,14 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
css: scope.cm.css.getValue(),
|
css: scope.cm.css.getValue(),
|
||||||
js: scope.cm.js.getValue()
|
js: scope.cm.js.getValue()
|
||||||
};
|
};
|
||||||
|
utils.log('setPreviewContent', isForced)
|
||||||
// If just CSS was changed (and everything shudn't be empty),
|
// If just CSS was changed (and everything shudn't be empty),
|
||||||
// change the styles inside the iframe.
|
// change the styles inside the iframe.
|
||||||
if (!isForced && currentCode.html === codeInPreview.html && currentCode.js === codeInPreview.js) {
|
if (!isForced && currentCode.html === codeInPreview.html && currentCode.js === codeInPreview.js) {
|
||||||
computeCss().then(function (css) {
|
computeCss().then(function (css) {
|
||||||
|
if (frame.contentDocument.querySelector('#webmakerstyle')) {
|
||||||
frame.contentDocument.querySelector('#webmakerstyle').textContent = css;
|
frame.contentDocument.querySelector('#webmakerstyle').textContent = css;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
var htmlPromise = computeHtml();
|
var htmlPromise = computeHtml();
|
||||||
@ -866,9 +900,12 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
});
|
});
|
||||||
cm.on('change', function onChange(editor, change) {
|
cm.on('change', function onChange(editor, change) {
|
||||||
clearTimeout(updateTimer);
|
clearTimeout(updateTimer);
|
||||||
|
|
||||||
updateTimer = setTimeout(function () {
|
updateTimer = setTimeout(function () {
|
||||||
scope.setPreviewContent();
|
scope.setPreviewContent();
|
||||||
if (change.origin === '+input') {
|
// If this isn a user triggered change, handle unsaved changes count.
|
||||||
|
console.log(change.origin)
|
||||||
|
if (change.origin === '+input' || change.origin === '+delete') {
|
||||||
saveBtn.classList.add('is-marked');
|
saveBtn.classList.add('is-marked');
|
||||||
unsavedEditCount += 1;
|
unsavedEditCount += 1;
|
||||||
if (unsavedEditCount % unsavedEditWarningCount === 0 && unsavedEditCount >= unsavedEditWarningCount) {
|
if (unsavedEditCount % unsavedEditWarningCount === 0 && unsavedEditCount >= unsavedEditWarningCount) {
|
||||||
@ -1154,7 +1191,7 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
var settingName = e.target.dataset.setting;
|
var settingName = e.target.dataset.setting;
|
||||||
var obj = {};
|
var obj = {};
|
||||||
var el = e.target;
|
var el = e.target;
|
||||||
console.log(e, settingName, (el.type === 'checkbox') ? el.checked : el.value);
|
utils.log(e, settingName, (el.type === 'checkbox') ? el.checked : el.value);
|
||||||
prefs[settingName] = el.type === 'checkbox' ? el.checked : el.value;
|
prefs[settingName] = el.type === 'checkbox' ? el.checked : el.value;
|
||||||
obj[settingName] = prefs[settingName];
|
obj[settingName] = prefs[settingName];
|
||||||
chrome.storage.sync.set(obj, function() {
|
chrome.storage.sync.set(obj, function() {
|
||||||
@ -1191,6 +1228,8 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
if (shouldDiscard) {
|
if (shouldDiscard) {
|
||||||
createNewItem();
|
createNewItem();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
createNewItem();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
scope.onOpenBtnClick = function () {
|
scope.onOpenBtnClick = function () {
|
||||||
@ -1320,11 +1359,11 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
|
|||||||
var currentMode = type === 'html' ? htmlMode : (type === 'css' ? cssMode : jsMode);
|
var currentMode = type === 'html' ? htmlMode : (type === 'css' ? cssMode : jsMode);
|
||||||
if (currentMode !== mode) {
|
if (currentMode !== mode) {
|
||||||
if (type === 'html') {
|
if (type === 'html') {
|
||||||
updateHtmlMode(mode);
|
updateHtmlMode(mode).then(() => scope.setPreviewContent(true));
|
||||||
} else if (type === 'js') {
|
} else if (type === 'js') {
|
||||||
updateJsMode(mode);
|
updateJsMode(mode).then(() => scope.setPreviewContent(true));
|
||||||
} else if (type === 'css') {
|
} else if (type === 'css') {
|
||||||
updateCssMode(mode);
|
updateCssMode(mode).then(() => scope.setPreviewContent(true));
|
||||||
}
|
}
|
||||||
trackEvent('ui', 'updateCodeMode', mode);
|
trackEvent('ui', 'updateCodeMode', mode);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user