upgrade PureScript to v0.15
This commit is contained in:
parent
1e695efc87
commit
1a3bbef162
|
@ -1,3 +1,7 @@
|
||||||
|
__v0.0.14__
|
||||||
|
upgrade to purescript v0.15
|
||||||
|
increase bookmarklet window height
|
||||||
|
|
||||||
__v0.0.13__
|
__v0.0.13__
|
||||||
add setting ALLOW_NON_HTTP_URL_SCHEMES (default false)
|
add setting ALLOW_NON_HTTP_URL_SCHEMES (default false)
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,6 @@ extra-source-files:
|
||||||
purs/src/App.purs
|
purs/src/App.purs
|
||||||
purs/src/Globals.js
|
purs/src/Globals.js
|
||||||
purs/src/Globals.purs
|
purs/src/Globals.purs
|
||||||
purs/src/Main.js
|
|
||||||
purs/src/Main.purs
|
purs/src/Main.purs
|
||||||
purs/src/Marked.js
|
purs/src/Marked.js
|
||||||
purs/src/Marked.purs
|
purs/src/Marked.purs
|
||||||
|
|
|
@ -9,16 +9,16 @@ build:
|
||||||
@npm run spago build
|
@npm run spago build
|
||||||
|
|
||||||
bundle: build
|
bundle: build
|
||||||
@npm run spago -- bundle-app --to dist/bundle.js
|
@npm run esbuild-bundle
|
||||||
@npm run parcel-build
|
@npm run esbuild-bundle-min
|
||||||
@rm -f dist/*.gz
|
@rm -f dist/*.gz
|
||||||
@gzip -k dist/app.min.js.map
|
@gzip -k dist/app.min.js.map
|
||||||
@gzip -k dist/app.min.js
|
@gzip -k dist/app.min.js
|
||||||
@find dist -type f -printf "%kK\\t%h/%f\\n" | sort -k 2
|
@find dist -type f -printf "%kK\\t%h/%f\\n" | sort -k 2
|
||||||
@cp dist/app.min.js.map ../static/js/app.min.js.map
|
|
||||||
@cp dist/app.min.js.map.gz ../static/js/app.min.js.map.gz
|
|
||||||
@cp dist/app.min.js ../static/js/app.min.js
|
@cp dist/app.min.js ../static/js/app.min.js
|
||||||
@cp dist/app.min.js.gz ../static/js/app.min.js.gz
|
@cp dist/app.min.js.gz ../static/js/app.min.js.gz
|
||||||
|
@cp dist/app.min.js.map ../static/js/app.min.js.map
|
||||||
|
@cp dist/app.min.js.map.gz ../static/js/app.min.js.map.gz
|
||||||
|
|
||||||
docs:
|
docs:
|
||||||
@rm -Rf generated-docs
|
@rm -Rf generated-docs
|
||||||
|
|
15506
purs/package-lock.json
generated
15506
purs/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -6,17 +6,17 @@
|
||||||
"purs": "purs",
|
"purs": "purs",
|
||||||
"make-install": "make install",
|
"make-install": "make install",
|
||||||
"make-watch": "inotifywait -m -r -q -e close_write --format '%T %w%f' --timefmt '%T' src | while read FILE; do echo $FILE; make; done",
|
"make-watch": "inotifywait -m -r -q -e close_write --format '%T %w%f' --timefmt '%T' src | while read FILE; do echo $FILE; make; done",
|
||||||
"parcel-build": "parcel build dist/bundle.js --out-file dist/app.min.js --public-url /static/js/"
|
"esbuild-bundle": "esbuild ./output/Main/index.js --bundle --format=iife --global-name=PS --target=chrome58,firefox57,edge18 --outfile=dist/app.js",
|
||||||
|
"esbuild-bundle-min": "esbuild ./output/Main/index.js --bundle --format=iife --global-name=PS --target=chrome58,firefox57,edge18 --minify --sourcemap --outfile=dist/app.min.js"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"marked": "^3.0.2",
|
"esbuild": "0.14.42",
|
||||||
"moment": "^2.29.1",
|
"purescript": "0.15.2",
|
||||||
"parcel-bundler": "^1.12.5",
|
"spago": "0.20.9"
|
||||||
"purescript": "^0.14.9",
|
|
||||||
"spago": "^0.20.7",
|
|
||||||
"terser": "^5.12.1"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dompurify": "^2.3.3"
|
"dompurify": "2.3.8",
|
||||||
|
"marked": "4.0.16",
|
||||||
|
"moment": "2.29.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,36 @@ in upstream
|
||||||
}
|
}
|
||||||
-}
|
-}
|
||||||
let upstream =
|
let upstream =
|
||||||
https://raw.githubusercontent.com/purescript/package-sets/psc-0.14.7-20220404/src/packages.dhall
|
https://raw.githubusercontent.com/purescript/package-sets/psc-0.15.2-20220531/src/packages.dhall
|
||||||
sha256:75d0f0719f32456e6bdc3efd41cfc64785655d2b751e3d080bd849033ed053f2
|
sha256:278d3608439187e51136251ebf12fabda62d41ceb4bec9769312a08b56f853e3
|
||||||
|
|
||||||
in upstream
|
in upstream
|
||||||
|
with simple-json = {
|
||||||
|
dependencies= [
|
||||||
|
"arrays",
|
||||||
|
"exceptions",
|
||||||
|
"foreign",
|
||||||
|
"foreign-object",
|
||||||
|
"nullable",
|
||||||
|
"prelude",
|
||||||
|
"record",
|
||||||
|
"typelevel-prelude",
|
||||||
|
"variant"
|
||||||
|
],
|
||||||
|
repo= "https://github.com/justinwoo/purescript-simple-json.git",
|
||||||
|
version= "v9.0.0"
|
||||||
|
}
|
||||||
|
with simple-json = {
|
||||||
|
dependencies= [
|
||||||
|
"arrays",
|
||||||
|
"exceptions",
|
||||||
|
"foreign",
|
||||||
|
"foreign-object",
|
||||||
|
"nullable",
|
||||||
|
"prelude",
|
||||||
|
"record",
|
||||||
|
"typelevel-prelude",
|
||||||
|
"variant"
|
||||||
|
],
|
||||||
|
repo= "https://github.com/justinwoo/purescript-simple-json.git",
|
||||||
|
version= "v9.0.0"
|
||||||
|
}
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
, dependencies =
|
, dependencies =
|
||||||
[ "aff"
|
[ "aff"
|
||||||
, "affjax"
|
, "affjax"
|
||||||
|
, "affjax-web"
|
||||||
, "argonaut"
|
, "argonaut"
|
||||||
, "arrays"
|
, "arrays"
|
||||||
, "console"
|
, "console"
|
||||||
, "const"
|
, "const"
|
||||||
|
, "dom-indexed"
|
||||||
, "effect"
|
, "effect"
|
||||||
, "either"
|
, "either"
|
||||||
, "foldable-traversable"
|
, "foldable-traversable"
|
||||||
|
@ -18,11 +20,11 @@
|
||||||
, "http-methods"
|
, "http-methods"
|
||||||
, "integers"
|
, "integers"
|
||||||
, "js-uri"
|
, "js-uri"
|
||||||
, "math"
|
|
||||||
, "maybe"
|
, "maybe"
|
||||||
, "media-types"
|
, "media-types"
|
||||||
, "newtype"
|
, "newtype"
|
||||||
, "nullable"
|
, "nullable"
|
||||||
|
, "numbers"
|
||||||
, "partial"
|
, "partial"
|
||||||
, "prelude"
|
, "prelude"
|
||||||
, "profunctor-lenses"
|
, "profunctor-lenses"
|
||||||
|
|
|
@ -2,9 +2,9 @@ module App where
|
||||||
|
|
||||||
import Prelude
|
import Prelude
|
||||||
|
|
||||||
import Affjax (Response, Error)
|
import Affjax.Web (Response, Error)
|
||||||
import Affjax (defaultRequest) as AX
|
import Affjax.Web (defaultRequest) as AX
|
||||||
import Affjax as Ax
|
import Affjax.Web as Ax
|
||||||
import Affjax.RequestBody as AXReq
|
import Affjax.RequestBody as AXReq
|
||||||
import Affjax.RequestHeader (RequestHeader(..))
|
import Affjax.RequestHeader (RequestHeader(..))
|
||||||
import Affjax.ResponseFormat as AXRes
|
import Affjax.ResponseFormat as AXRes
|
||||||
|
|
|
@ -25,6 +25,7 @@ import Web.Event.Event (Event, preventDefault)
|
||||||
import Web.HTML (window)
|
import Web.HTML (window)
|
||||||
import Web.HTML.HTMLDocument (referrer)
|
import Web.HTML.HTMLDocument (referrer)
|
||||||
import Web.HTML.Location (setHref, origin)
|
import Web.HTML.Location (setHref, origin)
|
||||||
|
import DOM.HTML.Indexed.AutocompleteType (AutocompleteType(..))
|
||||||
|
|
||||||
data BAction
|
data BAction
|
||||||
= BEditField EditField
|
= BEditField EditField
|
||||||
|
@ -114,7 +115,7 @@ addbmark b' =
|
||||||
]
|
]
|
||||||
, tr_
|
, tr_
|
||||||
[ td_ [ label [ for "tags" ] [ text "tags" ] ]
|
[ td_ [ label [ for "tags" ] [ text "tags" ] ]
|
||||||
, td_ [ input [ type_ InputText , id "tags", class_ "w-100 mv1" , name "tags", autocomplete false, attr "autocapitalize" "off", autofocus (not $ null bm.url)
|
, td_ [ input [ type_ InputText , id "tags", class_ "w-100 mv1" , name "tags", autocomplete AutocompleteOff, attr "autocapitalize" "off", autofocus (not $ null bm.url)
|
||||||
, value (edit_bm.tags) , onValueChange (editField Etags)] ]
|
, value (edit_bm.tags) , onValueChange (editField Etags)] ]
|
||||||
]
|
]
|
||||||
, tr_
|
, tr_
|
||||||
|
|
|
@ -27,6 +27,7 @@ import Model (Bookmark)
|
||||||
import Type.Proxy (Proxy(..))
|
import Type.Proxy (Proxy(..))
|
||||||
import Util (attr, class_, encodeTag, fromNullableStr, ifElseH, whenA, whenH)
|
import Util (attr, class_, encodeTag, fromNullableStr, ifElseH, whenA, whenH)
|
||||||
import Web.Event.Event (Event, preventDefault)
|
import Web.Event.Event (Event, preventDefault)
|
||||||
|
import DOM.HTML.Indexed.AutocompleteType (AutocompleteType(..))
|
||||||
|
|
||||||
-- | UI Events
|
-- | UI Events
|
||||||
data BAction
|
data BAction
|
||||||
|
@ -179,7 +180,7 @@ bmark b' =
|
||||||
, div [ id "tags_input_box"]
|
, div [ id "tags_input_box"]
|
||||||
[ div_ [ text "tags" ]
|
[ div_ [ text "tags" ]
|
||||||
, input [ id (tagid edit_bm), type_ InputText , class_ "tags w-100 mb1 pt1 edit_form_input" , name "tags"
|
, input [ id (tagid edit_bm), type_ InputText , class_ "tags w-100 mb1 pt1 edit_form_input" , name "tags"
|
||||||
, autocomplete false, attr "autocapitalize" "off"
|
, autocomplete AutocompleteOff, attr "autocapitalize" "off"
|
||||||
, value (edit_bm.tags) , onValueChange (editField Etags) ]
|
, value (edit_bm.tags) , onValueChange (editField Etags) ]
|
||||||
]
|
]
|
||||||
, div [ class_ "edit_form_checkboxes mv3"]
|
, div [ class_ "edit_form_checkboxes mv3"]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// use at your own risk!
|
// use at your own risk!
|
||||||
exports.unsafeSetInnerHTML = function(element) {
|
export const unsafeSetInnerHTML = function(element) {
|
||||||
return function(html) {
|
return function(html) {
|
||||||
return function() {
|
return function() {
|
||||||
element.innerHTML = html;
|
element.innerHTML = html;
|
||||||
|
|
|
@ -21,7 +21,7 @@ import Halogen as H
|
||||||
import Halogen.HTML (HTML, a, attr, button, div, text)
|
import Halogen.HTML (HTML, a, attr, button, div, text)
|
||||||
import Halogen.HTML.Events (onClick)
|
import Halogen.HTML.Events (onClick)
|
||||||
import Halogen.HTML.Properties (ButtonType(..), href, title, type_)
|
import Halogen.HTML.Properties (ButtonType(..), href, title, type_)
|
||||||
import Math (log)
|
import Data.Number (log)
|
||||||
import Model (TagCloud, TagCloudModeF(..), isExpanded, isRelated, setExpanded, tagCloudModeFromF)
|
import Model (TagCloud, TagCloudModeF(..), isExpanded, isRelated, setExpanded, tagCloudModeFromF)
|
||||||
import Util (class_, encodeTag, fromNullableStr, ifElseA, whenH)
|
import Util (class_, encodeTag, fromNullableStr, ifElseA, whenH)
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var moment = require("moment");
|
import moment from 'moment'
|
||||||
|
|
||||||
exports._app = function() {
|
export const _app = function() {
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
|
|
||||||
exports._closest = function(just, nothing, selector, el) {
|
export const _closest = function(just, nothing, selector, el) {
|
||||||
var node = el.closest(selector);
|
var node = el.closest(selector);
|
||||||
if(node) {
|
if(node) {
|
||||||
return just(node);
|
return just(node);
|
||||||
|
@ -15,26 +15,26 @@ exports._closest = function(just, nothing, selector, el) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exports._createFormData = function(formElement) {
|
export const _createFormData = function(formElement) {
|
||||||
return new FormData(formElement);
|
return new FormData(formElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
exports._createFormString = function(formElement) {
|
export const _createFormString = function(formElement) {
|
||||||
return new URLSearchParams(new FormData(formElement)).toString()
|
return new URLSearchParams(new FormData(formElement)).toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
exports._createFormArray = function(formElement) {
|
export const _createFormArray = function(formElement) {
|
||||||
return Array.from(new FormData(formElement));
|
return Array.from(new FormData(formElement));
|
||||||
}
|
}
|
||||||
|
|
||||||
exports._moment8601 = function(tuple, s) {
|
export const _moment8601 = function(tuple, s) {
|
||||||
var m = moment(s, moment.ISO_8601);
|
var m = moment(s, moment.ISO_8601);
|
||||||
var s1 = m.fromNow();
|
var s1 = m.fromNow();
|
||||||
var s2 = m.format('MMMM D YYYY, h:mm a') + " (" + m.format() + ") ";
|
var s2 = m.format('MMMM D YYYY, h:mm a') + " (" + m.format() + ") ";
|
||||||
return tuple(s1)(s2);
|
return tuple(s1)(s2);
|
||||||
}
|
}
|
||||||
|
|
||||||
exports._mmoment8601 = function(just, nothing, tuple, s) {
|
export const _mmoment8601 = function(just, nothing, tuple, s) {
|
||||||
try {
|
try {
|
||||||
var m = moment(s, moment.ISO_8601);
|
var m = moment(s, moment.ISO_8601);
|
||||||
var s1 = m.fromNow();
|
var s1 = m.fromNow();
|
||||||
|
@ -45,15 +45,15 @@ exports._mmoment8601 = function(just, nothing, tuple, s) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exports._closeWindow = function (window) {
|
export const _closeWindow = function (window) {
|
||||||
window.close();
|
window.close();
|
||||||
};
|
};
|
||||||
|
|
||||||
exports._setFocus = function(elemId) {
|
export const _setFocus = function(elemId) {
|
||||||
document.getElementById(elemId).focus();
|
document.getElementById(elemId).focus();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
exports._toLocaleDateString = function(dateString) {
|
export const _toLocaleDateString = function(dateString) {
|
||||||
return new Date(dateString).toLocaleDateString(undefined, {dateStyle: 'medium'})
|
return new Date(dateString).toLocaleDateString(undefined, {dateStyle: 'medium'})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
"use strict";
|
|
||||||
|
|
||||||
exports._mainImpl = function() {
|
|
||||||
return window.PS = PS;
|
|
||||||
}
|
|
|
@ -21,11 +21,6 @@ import Web.DOM.ParentNode (QuerySelector(..))
|
||||||
import Web.Event.Event (Event, preventDefault)
|
import Web.Event.Event (Event, preventDefault)
|
||||||
import Web.HTML.HTMLElement (toElement)
|
import Web.HTML.HTMLElement (toElement)
|
||||||
|
|
||||||
foreign import _mainImpl :: Effect Unit
|
|
||||||
|
|
||||||
main :: Effect Unit
|
|
||||||
main = _mainImpl
|
|
||||||
|
|
||||||
logoutE :: Event -> Effect Unit
|
logoutE :: Event -> Effect Unit
|
||||||
logoutE e = void <<< launchAff <<< logout =<< preventDefault e
|
logoutE e = void <<< launchAff <<< logout =<< preventDefault e
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
var marked = require("marked");
|
import { marked } from 'marked';
|
||||||
var DOMPurify = require("dompurify");
|
import DOMPurify from "dompurify"
|
||||||
|
|
||||||
marked.setOptions({
|
marked.setOptions({
|
||||||
pedantic: false,
|
pedantic: false,
|
||||||
gfm: true
|
gfm: true
|
||||||
});
|
});
|
||||||
|
|
||||||
exports.markedImpl = function(str) {
|
export const markedImpl = function(str) {
|
||||||
if (!str) return "";
|
if (!str) return "";
|
||||||
return DOMPurify.sanitize(marked(str));
|
return DOMPurify.sanitize(marked.parse(str));
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,7 +15,7 @@ getAccountSettingsR = do
|
||||||
app.dat.accountSettings = #{ toJSON accountSettings } || [];
|
app.dat.accountSettings = #{ toJSON accountSettings } || [];
|
||||||
|]
|
|]
|
||||||
toWidget [julius|
|
toWidget [julius|
|
||||||
PS['Main'].renderAccountSettings('##{rawJS accountSettingsEl}')(app.dat.accountSettings)();
|
PS.renderAccountSettings('##{rawJS accountSettingsEl}')(app.dat.accountSettings)();
|
||||||
|]
|
|]
|
||||||
|
|
||||||
postEditAccountSettingsR :: Handler ()
|
postEditAccountSettingsR :: Handler ()
|
||||||
|
|
|
@ -26,7 +26,7 @@ getAddViewR = do
|
||||||
app.dat.bmark = #{ toJSON (fromMaybe formurl mformdb) };
|
app.dat.bmark = #{ toJSON (fromMaybe formurl mformdb) };
|
||||||
|]
|
|]
|
||||||
toWidget [julius|
|
toWidget [julius|
|
||||||
PS['Main'].renderAddForm('##{rawJS renderEl}')(app.dat.bmark)();
|
PS.renderAddForm('##{rawJS renderEl}')(app.dat.bmark)();
|
||||||
|]
|
|]
|
||||||
|
|
||||||
bookmarkFormUrl :: Handler BookmarkForm
|
bookmarkFormUrl :: Handler BookmarkForm
|
||||||
|
|
|
@ -39,7 +39,7 @@ getNotesR unamep@(UserNameP uname) = do
|
||||||
app.dat.isowner = #{ isowner };
|
app.dat.isowner = #{ isowner };
|
||||||
|]
|
|]
|
||||||
toWidget [julius|
|
toWidget [julius|
|
||||||
PS['Main'].renderNotes('##{rawJS renderEl}')(app.dat.notes)();
|
PS.renderNotes('##{rawJS renderEl}')(app.dat.notes)();
|
||||||
|]
|
|]
|
||||||
|
|
||||||
getNoteR :: UserNameP -> NtSlug -> Handler Html
|
getNoteR :: UserNameP -> NtSlug -> Handler Html
|
||||||
|
@ -63,7 +63,7 @@ getNoteR unamep@(UserNameP uname) slug = do
|
||||||
app.dat.isowner = #{ isowner };
|
app.dat.isowner = #{ isowner };
|
||||||
|]
|
|]
|
||||||
toWidget [julius|
|
toWidget [julius|
|
||||||
PS['Main'].renderNote('##{rawJS renderEl}')(app.dat.note)();
|
PS.renderNote('##{rawJS renderEl}')(app.dat.note)();
|
||||||
|]
|
|]
|
||||||
|
|
||||||
getAddNoteSlimViewR :: Handler Html
|
getAddNoteSlimViewR :: Handler Html
|
||||||
|
@ -85,7 +85,7 @@ getAddNoteViewR unamep@(UserNameP uname) = do
|
||||||
app.dat.note = #{ toJSON enote } || [];
|
app.dat.note = #{ toJSON enote } || [];
|
||||||
|]
|
|]
|
||||||
toWidget [julius|
|
toWidget [julius|
|
||||||
PS['Main'].renderNote('##{rawJS renderEl}')(app.dat.note)();
|
PS.renderNote('##{rawJS renderEl}')(app.dat.note)();
|
||||||
|]
|
|]
|
||||||
|
|
||||||
deleteDeleteNoteR :: Int64 -> Handler Html
|
deleteDeleteNoteR :: Int64 -> Handler Html
|
||||||
|
|
|
@ -63,10 +63,10 @@ _getUser unamep@(UserNameP uname) sharedp' filterp' (TagsP pathtags) = do
|
||||||
|]
|
|]
|
||||||
toWidget [julius|
|
toWidget [julius|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
PS['Main'].renderBookmarks('##{rawJS renderEl}')(app.dat.bmarks)();
|
PS.renderBookmarks('##{rawJS renderEl}')(app.dat.bmarks)();
|
||||||
}, 0);
|
}, 0);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
PS['Main'].renderTagCloud('##{rawJS tagCloudRenderEl}')(app.tagCloudMode)();
|
PS.renderTagCloud('##{rawJS tagCloudRenderEl}')(app.tagCloudMode)();
|
||||||
}, 0);
|
}, 0);
|
||||||
|]
|
|]
|
||||||
|
|
||||||
|
|
84
static/js/app.min.js
vendored
84
static/js/app.min.js
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -18,7 +18,7 @@
|
||||||
<a .link href="@{AddNoteViewR (UserNameP userName)}">add note
|
<a .link href="@{AddNoteViewR (UserNameP userName)}">add note
|
||||||
<a .link href="@{NotesR (UserNameP userName)}">notes
|
<a .link href="@{NotesR (UserNameP userName)}">notes
|
||||||
<a .link href="@{AccountSettingsR}">settings
|
<a .link href="@{AccountSettingsR}">settings
|
||||||
<a .link onclick="PS['Main'].logoutE(event)()" href="@{AuthR LogoutR}">
|
<a .link onclick="PS.logoutE(event)()" href="@{AuthR LogoutR}">
|
||||||
log out
|
log out
|
||||||
$nothing
|
$nothing
|
||||||
<a .link href="@{AuthR LoginR}">
|
<a .link href="@{AuthR LoginR}">
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
- (#{userName})
|
- (#{userName})
|
||||||
<div .fr>
|
<div .fr>
|
||||||
$maybe userName <- musername
|
$maybe userName <- musername
|
||||||
<a .link onclick="PS['Main'].logoutE(event)()" href="@{AuthR LogoutR}">
|
<a .link onclick="PS.logoutE(event)()" href="@{AuthR LogoutR}">
|
||||||
[log out]
|
[log out]
|
||||||
$nothing
|
$nothing
|
||||||
<a .link href="@{AuthR LoginR}">
|
<a .link href="@{AuthR LoginR}">
|
||||||
|
|
Loading…
Reference in a new issue