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

162 lines
5.3 KiB
JavaScript
Raw Normal View History

'use strict';
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');
const socketio = require('./socketio');
2012-01-19 06:39:38 +01:00
let token, padId, exportLinks, socket, changesetLoader, BroadcastSlider;
2012-01-19 06:39:38 +01:00
const init = () => {
2020-11-23 19:24:19 +01:00
$(document).ready(() => {
// start the custom js
if (typeof customStart === 'function') customStart(); // eslint-disable-line no-undef
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
}
socket = socketio.connect(exports.baseURL);
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
});
socket.on('disconnect', (reason) => {
BroadcastSlider.showReconnectUI();
// The socket.io client will automatically try to reconnect for all reasons other than "io
// server disconnect".
if (reason === 'io server disconnect') socket.connect();
});
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' || message.type === 'COLLABROOM') {
changesetLoader.handleMessageFromServer(message);
}
2012-01-19 06:39:38 +01:00
});
2020-11-23 19:24:19 +01:00
// get all the export links
exportLinks = $('#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
});
};
2012-01-19 06:39:38 +01:00
2020-11-23 19:24:19 +01:00
// sends a message over the socket
const 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 = [];
const handleClientVars = (message) => {
2020-11-23 19:24:19 +01:00
// save the client Vars
window.clientVars = message.data;
2020-11-23 19:24:19 +01:00
// load all script that doesn't work without the clientVars
BroadcastSlider = require('./broadcast_slider')
.loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded);
2012-03-07 02:27:03 +01:00
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) => {
// exportLinks is a jQuery Array, so .each is allowed.
exportLinks.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
});
};
2015-04-05 16:18:36 +02:00
exports.baseURL = '';
2012-01-19 06:39:38 +01:00
exports.init = init;