{{ $t('users') }}
{{ $t('login') }}
{{ $t('changeUser') }}
{{ $t('addOnlineUser') }}
{{ $t('addOfflineUser') }}
{{ $t('settings') }}
{{ $t('aboutAstericsGrid') }}
{{ $t('help') }}
{{ $t('editingOn') }}
{{ $t('inputOptions') }}
{{ $t('unlock') }}
{{unlockCounter}}
{{ $t('search') }}
{{ $t('lock') }}
{{ $t('fullscreen') }}
{{ $t('editingOn') }}
!gridUtil.hasOutdatedThumbnail(toGrid)) { Router.toLastOpenedGrid(); } }); return; } if (this.updatedMetadataDoc && this.updatedMetadataDoc.fullscreen !== vueApp.metadata.fullscreen) { if (this.updatedMetadataDoc.fullscreen) { systemActionService.enterFullscreen(true); } else { $(document).trigger(constants.EVENT_SIDEBAR_OPEN); } } if (this.updatedMetadataDoc && this.updatedMetadataDoc.locked !== vueApp.metadata.locked) { if (this.updatedMetadataDoc.locked) { vueApp.lock(); } else { vueApp.unlock(true); } } } this.metadata = this.updatedMetadataDoc || this.metadata; }, async recalculateRenderGrid(gridData) { // attention: gridData also changes because of "noDeepCopy: true" // just using this.renderGridData for clarity this.showGrid = false; let globalGrid = null; gridData = gridUtil.fillFreeSpaces(gridData, GridElement.ELEMENT_TYPE_UI_FILLER); if (gridUtil.hasDynamicGridPlaceholder(this.globalGridData)) { this.globalGridData = gridUtil.fillFreeSpaces(this.globalGridData, GridElement.ELEMENT_TYPE_UI_FILLER); } if (gridData.showGlobalGrid) { globalGrid = this.globalGridData; if (gridData.globalGridId) { // custom global grid globalGrid = await dataService.getGrid(gridData.globalGridId, false, true); } this.renderGridData = gridUtil.mergeGrids(gridData, globalGrid, { globalGridHeightPercentage: this.metadata.globalGridHeightPercentage, noDeepCopy: true }); } else { this.renderGridData = gridData; } this.renderGridData = gridUtil.adaptFirstRowHeight(this.renderGridData, this.metadata.firstRowHeightFactor); this.renderGridData.minColumnCount = gridUtil.getWidthWithBounds(this.renderGridData); this.renderGridData.rowCount = gridUtil.getHeightWithBounds(this.renderGridData); this.renderGridData.gridElements = this.renderGridData.gridElements.filter(e => !e.hidden); // Check for local toggle level first, otherwise use synchronized metadata level let isToggled = localStorageService.get(localStorageService.KEY_CURRENT_TOGGLE_LEVEL); let effectiveLevel = isToggled ? localStorageService.getJSON(localStorageService.KEY_CURRENT_TOGGLE_LEVEL) : this.metadata.vocabularyLevel; if (effectiveLevel) { let globalGridElements = globalGrid ? globalGrid.gridElements : []; let globalGridElemIds = globalGridElements.map(e => e.id); let normalGridElements = this.renderGridData.gridElements.filter(e => !globalGridElemIds.includes(e.id)); let noneHasVocabLevelGlobal = globalGridElements.every(e => !e.vocabularyLevel); let noneHasVocabLevelNormal = normalGridElements.every(e => !e.vocabularyLevel); this.renderGridData.gridElements = this.renderGridData.gridElements.filter(e => { let elemFitsVocabLevel = e.vocabularyLevel && e.vocabularyLevel <= effectiveLevel; if (globalGridElemIds.includes(e.id)) { // is elem in global grid return noneHasVocabLevelGlobal || elemFitsVocabLevel || e.type !== GridElement.ELEMENT_TYPE_NORMAL; } else { // is elem in normal grid return noneHasVocabLevelNormal || elemFitsVocabLevel || e.type !== GridElement.ELEMENT_TYPE_NORMAL; } }); } this.showGrid = true; stateService.setCurrentGrid(this.renderGridData); }, onSidebarOpen() { if (!vueApp || !vueApp.metadata) { return; } vueApp.metadata.fullscreen = false; $(document).trigger(constants.EVENT_GRID_RESIZE); }, resizeListener() { let thiz = this; util.debounce(function () { if (thiz.huffmanInput) { thiz.huffmanInput.reinit(); } }, 500); }, contextMenuListener(event) { event.preventDefault(); }, async metadataUpdated() { this.metadata = await dataService.getMetadata(); }, async rerenderGrid() { if (this.renderGridData) { // Reload the grid with fresh data without updating metadata let freshGridData = await dataService.getGrid(this.renderGridData.id); await this.loadGrid(freshGridData, { forceReload: true }); } } }, created() { $(document).on(constants.EVENT_DB_PULL_UPDATED, this.onExternalUpdate); $(document).on(constants.EVENT_SIDEBAR_OPEN, this.onSidebarOpen); $(document).on(constants.EVENT_NAVIGATE_GRID_IN_VIEWMODE, this.onNavigateEvent); document.addEventListener('contextmenu', this.contextMenuListener); window.addEventListener('resize', this.resizeListener, true); $(document).on(constants.EVENT_GRID_RESIZE, this.resizeListener); $(document).on(constants.EVENT_METADATA_UPDATED, this.metadataUpdated); $(document).on(constants.EVENT_GRID_RERENDER, this.rerenderGrid); }, beforeDestroy() { $(document).off(constants.EVENT_DB_PULL_UPDATED, this.onExternalUpdate); $(document).off(constants.EVENT_SIDEBAR_OPEN, this.onSidebarOpen); $(document).off(constants.EVENT_NAVIGATE_GRID_IN_VIEWMODE, this.onNavigateEvent); document.removeEventListener('contextmenu', this.contextMenuListener); window.removeEventListener('resize', this.resizeListener, true); $(document).off(constants.EVENT_GRID_RESIZE, this.resizeListener); $(document).off(constants.EVENT_METADATA_UPDATED, this.metadataUpdated); $(document).off(constants.EVENT_GRID_RERENDER, this.rerenderGrid); stopInputMethods(); this.setViewPropsUnlocked(); $.contextMenu('destroy'); liveElementService.stop(); vueApp = null; }, mounted: async function () { vueApp = this; let savedMetadata = await dataService.getMetadata(); let metadata = JSON.parse(JSON.stringify(savedMetadata || new MetaData())); metadata.lastOpenedGridId = this.gridId; metadata.locked = metadata.locked === undefined ? urlParamService.isDemoMode() && dataService.getCurrentUser() === constants.LOCAL_DEMO_USERNAME : metadata.locked; if (metadata.locked) { $(document).trigger(constants.EVENT_UI_LOCKED); } metadata.fullscreen = metadata.fullscreen === undefined ? urlParamService.isDemoMode() && dataService.getCurrentUser() === constants.LOCAL_DEMO_USERNAME : metadata.fullscreen; metadata.fullscreen = urlParamService.isFullscreen(true) ? true : metadata.fullscreen; metadata.fullscreen = metadata.fullscreen && util.isFullscreen(); metadata.locked = urlParamService.isLocked(true) ? true : metadata.locked; metadata.inputConfig.scanEnabled = urlParamService.isScanningEnabled() ? true : metadata.inputConfig.scanEnabled; metadata.inputConfig.dirEnabled = urlParamService.isDirectionEnabled() ? true : metadata.inputConfig.dirEnabled; metadata.inputConfig.huffEnabled = urlParamService.isHuffmanEnabled() ? true : metadata.inputConfig.huffEnabled; dataService.saveMetadata(metadata).then(() => { if (metadata.locked) { this.setViewPropsLocked(); } }); this.metadata = metadata; this.globalGridData = await dataService.getGlobalGrid(); let gridData = await dataService.getGrid(this.gridId, false, true); if (!gridData) { log.warn('grid not found! gridId: ' + this.gridId); let grids = await dataService.getGrids(false, true); if (grids && grids[0]) { gridData = await dataService.getGrid(grids[0].id); } else { return Router.toManageGrids(); } } this.loadGrid(gridData); } }; function stopInputMethods() { if (!vueApp) { return; } if (vueApp.scanner) vueApp.scanner.destroy(); if (vueApp.hover) vueApp.hover.destroy(); if (vueApp.clicker) vueApp.clicker.destroy(); if (vueApp.directionInput) vueApp.directionInput.destroy(); if (vueApp.huffmanInput) vueApp.huffmanInput.destroy(); if (vueApp.seqInput) vueApp.seqInput.destroy(); vueApp.inputMethodsInitialized = false; } function initContextmenu() { $.contextMenu('destroy'); let CONTEXT_MOUSE = "CONTEXT_MOUSE"; let CONTEXT_SCANNING = "CONTEXT_SCA
{{ $t('editingOff') }}
{{ $t('more') }}
{{ $t('undo') }}
{{ $t('redo') }}
{{ $t('transferProperties') }}
:
{{ $t('selectTargetElements') }}
...
{{ $t('cancel') }}
{{ $t('ok') }}
{editElementId = id; showActionsModal = true}"/>
startPropTransfer(propTransferObject)" @close="showPropTransferModal = false">
{{ $t('loggedInAs') }}
{{currentUser}}
{{ $t('usingOfflineUser') }}
{{currentUser}}
{{ $t('notLoggedIn') }}
It's your turn
IPTV
Web Browser
MDliOTUybW84ZzN1YTd3Z2VvM2R2aWtweWtjNXJhenFyY3ZhZndybmE5OXM4aiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/7wv2tBHSeLOnBzMWoS/giphy.gif" alt="" height="1080" width="1080">
Chile TV
The Sims
Most Viewed Locations Google Maps
Supermarket Store Chile
Google Spanish
Google Spanish with PHP
function logAndRedirect(missingFeature) { console.warn("Browser doesn't support " + missingFeature + "."); window.location.replace("unsupported.html"); } function testEval(evalString, msg) { try { eval(evalString); } catch (e) { console.log(e); logAndRedirect(msg); } } The Phone with LogoRemakeFour (touch, click) The Computer with LogoRemakeFour (keyboard, mouse)
IPTV
Outlook
Microsoft Chile
Play
LogoRemakeFour
LogoRemakeFour Toon Blast
LRF Editor Toon Blast
Camera
LogoRemakeFour on GitHub
Activate Windows
Email
Search
Toon Blast
Never Gonna You Give Up
Gangnam
LogoRemakeFour Unsupported
Playlist JKAnime
Windows 7 Emulator
Thriller 4K Remaster
Asterics AAC
{ "@context": "http://schema.org", "@id": "https://lrfeditor1807.github.io/#website", "@type": "WebSite", "url": "https://lrfeditor1807.github.io", "name": "LogoRemakeFour", "potentialAction": { "@type": "SearchAction", "target": "https://lrfeditor1807.github.io/search/{search_term_string}?src=mc_google", "query-input": "required name=search_term_string" } { "@context": "http://schema.org", "@id": "https://lrfeditor1807.github.io/#organization", "@type": "Organization", "name": "LogoRemakeFour", "url": "https://lrfeditor1807.github.io", "logo": "https://lrfeditor1807.github.io/logo.png", "subOrganization": { "@type": "Organization", "name": "LogoRemakeFour en EspaƱol", "url": "https://lrfeditor1807.github.io/es", "@id": "https://lrfeditor1807.github.io/es/#organization" }