etherpad-lite/src/static/js/timeslider.js

161 lines
5.3 KiB
JavaScript
Raw Normal View History

2012-01-19 06:39:38 +01:00
/**
* This code is mostly from the old Etherpad. Please help us to comment this code.
* This helps other people to understand this code better and helps them to improve it.
* TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED
*/
/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS-IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// These jQuery things should create local references, but for now `require()`
// assigns to the global `$` and augments it with plugins.
2012-03-07 02:27:03 +01:00
require('./jquery');
const Cookies = require('./pad_utils').Cookies;
2020-11-23 19:24:19 +01:00
const randomString = require('./pad_utils').randomString;
const hooks = require('./pluginfw/hooks');
2012-01-19 06:39:38 +01:00
2020-11-23 19:24:19 +01:00
let token, padId, export_links;
2012-01-19 06:39:38 +01:00
function init() {
2020-11-23 19:24:19 +01:00
$(document).ready(() => {
// start the custom js
2020-11-23 19:24:19 +01:00
if (typeof customStart === 'function') customStart();
2012-01-19 06:39:38 +01:00
2020-11-23 19:24:19 +01:00
// get the padId out of the url
const urlParts = document.location.pathname.split('/');
padId = decodeURIComponent(urlParts[urlParts.length - 2]);
2012-01-19 06:39:38 +01:00
2020-11-23 19:24:19 +01:00
// set the title
document.title = `${padId.replace(/_+/g, ' ')} | ${document.title}`;
2012-01-19 06:39:38 +01:00
2020-11-23 19:24:19 +01:00
// ensure we have a token
token = Cookies.get('token');
2020-11-23 19:24:19 +01:00
if (token == null) {
token = `t.${randomString()}`;
Cookies.set('token', token, {expires: 60});
2012-01-19 06:39:38 +01:00
}
2020-11-23 19:24:19 +01:00
const loc = document.location;
// get the correct port
const port = loc.port == '' ? (loc.protocol == 'https:' ? 443 : 80) : loc.port;
// create the url
const url = `${loc.protocol}//${loc.hostname}:${port}/`;
// find out in which subfolder we are
const resource = `${exports.baseURL.substring(1)}socket.io`;
2020-11-23 19:24:19 +01:00
// build up the socket io connection
socket = io.connect(url, {path: `${exports.baseURL}socket.io`, resource});
2020-11-23 19:24:19 +01:00
// send the ready message once we're connected
socket.on('connect', () => {
sendSocketMsg('CLIENT_READY', {});
2012-01-19 06:39:38 +01:00
});
2020-11-23 19:24:19 +01:00
socket.on('disconnect', () => {
BroadcastSlider.showReconnectUI();
});
2020-11-23 19:24:19 +01:00
// route the incoming messages
socket.on('message', (message) => {
if (message.type == 'CLIENT_VARS') {
2012-01-19 06:39:38 +01:00
handleClientVars(message);
2020-11-23 19:24:19 +01:00
} else if (message.accessStatus) {
$('body').html('<h2>You have no permission to access this pad</h2>');
} else if (message.type === 'CHANGESET_REQ') { changesetLoader.handleMessageFromServer(message); }
2012-01-19 06:39:38 +01:00
});
2020-11-23 19:24:19 +01:00
// get all the export links
export_links = $('#export > .exportlink');
2012-01-19 06:39:38 +01:00
2020-11-23 19:24:19 +01:00
$('button#forcereconnect').click(() => {
window.location.reload();
});
2013-02-18 22:03:52 +01:00
exports.socket = socket; // make the socket available
exports.BroadcastSlider = BroadcastSlider; // Make the slider available
2013-02-18 22:03:52 +01:00
2020-11-23 19:24:19 +01:00
hooks.aCallAll('postTimesliderInit');
2012-01-19 06:39:38 +01:00
});
}
2020-11-23 19:24:19 +01:00
// sends a message over the socket
function sendSocketMsg(type, data) {
socket.json.send({
component: 'pad', // FIXME: Remove this stupidity!
type,
data,
padId,
token,
sessionID: Cookies.get('sessionID'),
protocolVersion: 2,
});
2012-01-19 06:39:38 +01:00
}
2020-11-23 19:24:19 +01:00
const fireWhenAllScriptsAreLoaded = [];
2020-11-23 19:24:19 +01:00
let changesetLoader;
function handleClientVars(message) {
2020-11-23 19:24:19 +01:00
// save the client Vars
2012-01-19 06:39:38 +01:00
clientVars = message.data;
2020-11-23 19:24:19 +01:00
// load all script that doesn't work without the clientVars
2012-03-07 02:27:03 +01:00
BroadcastSlider = require('./broadcast_slider').loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded);
require('./broadcast_revisions').loadBroadcastRevisionsJS();
changesetLoader = require('./broadcast').loadBroadcastJS(socket, sendSocketMsg, fireWhenAllScriptsAreLoaded, BroadcastSlider);
2012-01-19 06:39:38 +01:00
2020-11-23 19:24:19 +01:00
// initialize export ui
2012-03-07 02:27:03 +01:00
require('./pad_impexp').padimpexp.init();
2012-01-19 06:39:38 +01:00
// Create a base URI used for timeslider exports
2020-11-23 19:24:19 +01:00
const baseURI = document.location.pathname;
2020-11-23 19:24:19 +01:00
// change export urls when the slider moves
BroadcastSlider.onSlider((revno) => {
// export_links is a jQuery Array, so .each is allowed.
2020-11-23 19:24:19 +01:00
export_links.each(function () {
// Modified from regular expression to fix:
// https://github.com/ether/etherpad-lite/issues/4071
// Where a padId that was numeric would create the wrong export link
2020-11-23 19:24:19 +01:00
if (this.href) {
const type = this.href.split('export/')[1];
let href = baseURI.split('timeslider')[0];
href += `${revno}/export/${type}`;
this.setAttribute('href', href);
}
2012-01-19 06:39:38 +01:00
});
});
2020-11-23 19:24:19 +01:00
// fire all start functions of these scripts, formerly fired with window.load
for (let i = 0; i < fireWhenAllScriptsAreLoaded.length; i++) {
2012-01-19 06:39:38 +01:00
fireWhenAllScriptsAreLoaded[i]();
}
2020-11-23 19:24:19 +01:00
$('#ui-slider-handle').css('left', $('#ui-slider-bar').width() - 2);
2015-04-02 01:03:34 +02:00
// Translate some strings where we only want to set the title not the actual values
2020-11-23 19:24:19 +01:00
$('#playpause_button_icon').attr('title', html10n.get('timeslider.playPause'));
$('#leftstep').attr('title', html10n.get('timeslider.backRevision'));
$('#rightstep').attr('title', html10n.get('timeslider.forwardRevision'));
2015-04-02 01:03:34 +02:00
2015-04-05 16:18:36 +02:00
// font family change
2020-11-23 19:24:19 +01:00
$('#viewfontmenu').change(function () {
$('#innerdocbody').css('font-family', $(this).val() || '');
2015-04-05 16:18:36 +02:00
});
}
exports.baseURL = '';
2012-01-19 06:39:38 +01:00
exports.init = init;