From 18673e1b3b741c30d1f7bb02e637aed764d29c20 Mon Sep 17 00:00:00 2001 From: zelfroster Date: Mon, 21 Aug 2023 16:12:37 +0530 Subject: [PATCH 1/4] chore: remove old and unused files --- GSoC_2019.txt | 113 ------------------------- TODO.md | 12 --- tests/basic_RS_communication_test.html | 73 ---------------- webui-src/make-src/chat.css | 72 ---------------- webui-src/make-src/main.css | 7 -- 5 files changed, 277 deletions(-) delete mode 100644 GSoC_2019.txt delete mode 100644 TODO.md delete mode 100644 tests/basic_RS_communication_test.html delete mode 100644 webui-src/make-src/chat.css delete mode 100644 webui-src/make-src/main.css diff --git a/GSoC_2019.txt b/GSoC_2019.txt deleted file mode 100644 index 408d9fe..0000000 --- a/GSoC_2019.txt +++ /dev/null @@ -1,113 +0,0 @@ -Required info -============= - -- compilation of RS: - - * compile RS with JSon api - $ qmake CONFIG="debug rs_jsonapi" - $ make - - Make sure JSon API is activated in preferences->JSon API. - - * to update after adding new API functions, - $ \rm jsonapi_generator/src/*inl - $ make - -- test RS API with curl: - - * register a login:passwd token preferences - - $ curl --verbose -u login:passwd -H "Content-Type: application/json" http://127.0.0.1:9092/rsPeers/GetRetroshareInvite - - * Trying 127.0.0.1... - * Connected to 127.0.0.1 (127.0.0.1) port 9092 (#0) - [...] - > Authorization: Basic bG9naW46cGFzc3dkCg== - [...] - < Content-Type: text/json - < - { - "retval": "CQEGAcGcxsBNBFNSZ4sBCAC7RIqGLdM+S [...] - } - - -- Existing code base: - * New WebUI: https://github/com/csoler/RSNewWebUI - - This is a prototype for the new web interface, that uses the JSon API. It is extremely preliminary but already solves a few problems including - the communication with RS Json api. It is the starting point for this project or at least a working example. - - Compile using qmake only: - $ qmake - - Then open it with - $ firefox webui/index.html - - See tests/basic_RS_communication_test.html: - - * uses authentication with a hard-coded user+passwd in order to retrieve data. Make sure the login/passwd that is used is actually registered in RS. - The example should show a "chat server" page with a proper certificate of a RS node in the bottom field. - - * old WebUI, also based on mithril is in retroshare main repository: libresapi/src/webui-src/app. - -Other sources of information: - * JSon API documentation: https://github.com/RetroShare/RetroShare/tree/master/jsonapi-generator - - -TODO List -========= - -By order of priority: - -================+==========+===========+===========================================================================================================+ -Section | ID | Status | What | -================+==========+===========+===========================================================================================================+ -Preliminary | 001 | Done | Create a standalone working mithril example not talking to RS, for testing authenticated requests. | - | 002 | Done | Modify 001 it so that it prints some information that is from RS | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ -WebUI General | 101 | Done | Create a login page that asks for login+passwd to be used in the JSonAPI requests | - | 102 | Done | Create "tab" system to allow different sections of the webUI to be displayed (See previous WebUI) | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ -WebUI RS side | 201 | | Update/copy the old WebUI page so that it allows to activate/desactivate the new WebUI | - | | | | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ -Config | 301 | | Create a Config panel with multiple frames to handle as many configuration options as possible | - | 302 | | Config frame for show node information | - | 303 | | Config frame for network settings (Net mode, NAT, DL limits, ports) | - | 304 | | Config frame for reputations in People | - | 305 | | Config frame for Files: all options (except edit share) | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ -Downloads | 401 | | Make downloads update automatically every second when visible | - | 402 | | Show more accurate information about file transfers: which chunks are already there, etc. | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ -Appearance | 501 | | Modify the css style to get something more professional | - | | | | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ -Files | 601 | | Show hierarchy of shared files | - | 602 | | Allow to edit file shares (which directory with which permission) | - | 603 | | Display current hashing status (requires auto-update) | - | 604 | | Allow to edit groups of friend nodes to manage file view permissions | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ -On merge | 701 | | Disable libresapi, remove old WebUI page | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ -Release | 801 | | Make sure the installer still works with the new WebUI. Test for windows, debian, MacOS | -----------------+----------+-----------+-----------------------------------------------------------------------------------------------------------+ - -Explanations - - 101 - The page should test the validity of the passwd by requesting some authenticated info and then switch to normal webUI when - authentication is a success. We may create a special API handler for that in RS if it is not possible to test authentication success. - - On RS side, the WebUI page should allow to set a login/passwd to access the WebUI and register that login/passwd into JSonAPI module when - changed/updated. - - 102 - The old WebUI has such a nice tab system. It's just a matter of adapting it. Do not keep the existing "Login" tab (that handled RS login, - not WebUI authentication) as RS login is handled when launching the software in both GUI and NO-GUI configurations. - - 401 - Previous WebUI used to do this, so it's possible. See the previous code and adapt it to the new WebUI. - 402 - This is mainy a graphical problem: obtain chunk info from rsFiles->FileChunkInfo() and display them with colors. - - 501 - The current green look of the WebUI is terrible. Aim for something more professional. Take inspiration from e.g transmission-gtk's WebUI - Add a nice background, more compact widgets, better colors, etc. - - diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 862838b..0000000 --- a/TODO.md +++ /dev/null @@ -1,12 +0,0 @@ -#### Next Steps - -- [ ] Private Chat -- [ ] Distant Chat -- [ ] Send Message (Mails) -- [ ] Chats - - [X] send Messages - -#### Later: -- [ ] Channels -- [ ] Boards -- [ ] Forums diff --git a/tests/basic_RS_communication_test.html b/tests/basic_RS_communication_test.html deleted file mode 100644 index fd31f25..0000000 --- a/tests/basic_RS_communication_test.html +++ /dev/null @@ -1,73 +0,0 @@ - - - Retroshare Web Interface - - - -

- Retroshare Web Interface -

-

- This node can help you to connect and find friends within the network. -

- -
-

- Enter your certificate into the following box and press the submit button. -

- - - -
- -
-

- Copy micheleangiolillo certificate's from the following box and paste - it in your node Add friends certificate box. -

- - -
- - diff --git a/webui-src/make-src/chat.css b/webui-src/make-src/chat.css deleted file mode 100644 index e76d764..0000000 --- a/webui-src/make-src/chat.css +++ /dev/null @@ -1,72 +0,0 @@ -.chat { - padding: 15px; } - .chat.container { - height: 100%; - padding: 0px; - position: relative; - box-sizing: border-box; } - .chat.header { - position: absolute; - top: 0px; - left: 0px; - right: 0px; - height: 50px; - background-color: black; - border-bottom: solid 1px gray; - box-sizing: border-box; } - .chat.left { - position: absolute; - top: 50px; - bottom: 0px; - left: 0px; - width: 200px; - box-sizing: border-box; - background-color: black; } - .chat.right { - position: absolute; - top: 50px; - right: 0px; - bottom: 0px; - width: 200px; - box-sizing: border-box; } - .chat.middle { - position: absolute; - top: 0px; - margin-top: 50px; - left: 200px; - right: 200px; - box-sizing: border-box; - padding: 0px; - height: 100%; - overflow-y: scroll; } - .chat.bottom { - position: absolute; - bottom: 0px; - right: 200px; - left: 200px; - padding: 5px; } - .chat.msg { - padding: 0px; } - .chat.msg.container { - position: relative; - border-bottom: solid 1px lightgray; - padding: 10px; - height: unset; } - .chat.msg.from { - position: absolute; - width: 100px; - top: 10px; - left: 0px; - color: white; - text-align: right; } - .chat.msg.when { - float: right; - color: lightgray; - margin-bottom: 10px; } - .chat.msg.text { - padding-left: 100px; - top: 0px; - left: 100px; - white-space: pre-wrap; - height: initial; } - diff --git a/webui-src/make-src/main.css b/webui-src/make-src/main.css deleted file mode 100644 index 7af82e0..0000000 --- a/webui-src/make-src/main.css +++ /dev/null @@ -1,7 +0,0 @@ -html, body, #main { - margin: 0; - height: 100%; - font-family: Helvetica, Arial, sans-serif; -} -#main { -} From b7f4d966944922c6bafcd1e6e74ed73aa6a933a3 Mon Sep 17 00:00:00 2001 From: zelfroster Date: Tue, 22 Aug 2023 10:19:32 +0530 Subject: [PATCH 2/4] chore: move html and css file to root webui-src directory and update build scripts --- webui-src/{assets => }/index.html | 2 +- webui-src/make-src/build.bat | 25 ++++++++------- webui-src/make-src/build.sh | 40 ++++++++++++++---------- webui-src/make-src/init.bat | 8 ++--- webui-src/make-src/init.sh | 8 ++--- webui-src/package.json | 8 ++--- webui-src/{styles/app.css => styles.css} | 0 webui.pro | 22 +++++-------- 8 files changed, 57 insertions(+), 56 deletions(-) rename webui-src/{assets => }/index.html (93%) rename webui-src/{styles/app.css => styles.css} (100%) diff --git a/webui-src/assets/index.html b/webui-src/index.html similarity index 93% rename from webui-src/assets/index.html rename to webui-src/index.html index ad4e3d6..74d35c7 100644 --- a/webui-src/assets/index.html +++ b/webui-src/index.html @@ -4,7 +4,7 @@ RetroShare - + diff --git a/webui-src/make-src/build.bat b/webui-src/make-src/build.bat index 2cef078..af06cd6 100644 --- a/webui-src/make-src/build.bat +++ b/webui-src/make-src/build.bat @@ -3,6 +3,8 @@ REM create webfiles from sources at compile time (works without npm/node.js) setlocal enabledelayedexpansion +echo "### Starting WebUI build ###" + set src=%~dp0..\..\webui-src rem Output destination @@ -12,9 +14,9 @@ if "%~1" == "" ( set publicdest=%~1\webui ) -if exist "%publicdest%" echo remove existing %publicdest%&&rd %publicdest% /S /Q +if exist "%publicdest%" echo removing existing %publicdest%&&rd %publicdest% /S /Q -echo mkdir %publicdest% +echo creating %publicdest% md %publicdest% rem Make full path @@ -22,8 +24,14 @@ pushd %publicdest% set publicdest=%cd% popd +echo copying html file +xcopy /s %src%\index.html %publicdest% + +echo copying css file +xcopy /s %src%\styles.css %publicdest% + echo building app.js -echo - copy template.js ... +echo - copying template.js ... copy %src%\make-src\template.js %publicdest%\app.js pushd %src%\app @@ -31,17 +39,13 @@ set "basefolder=%cd%\" for /R %%F in (*.js) do call :addfile-js "%basefolder%" "%%F" popd -rem #### copy css file generated by sass #### -echo copy css folder -xcopy /s %src%\styles\ %publicdest% - -echo copy assets folder +echo copying assets folder xcopy /s %src%\assets\ %publicdest% -echo copy data folder +echo copying data folder xcopy /s %src%\..\data %publicdest%\data\ -echo build.bat complete +echo "### WebUI build complete ###" goto :EOF @@ -59,5 +63,4 @@ type %fname% >> %publicdest%\app.js echo. >> %publicdest%\app.js echo }); >> %publicdest%\app.js - :EOF diff --git a/webui-src/make-src/build.sh b/webui-src/make-src/build.sh index 060ecc1..4b5dbf0 100755 --- a/webui-src/make-src/build.sh +++ b/webui-src/make-src/build.sh @@ -2,6 +2,8 @@ # create webfiles from sources at compile time (works without npm/node.js) +echo "### Starting WebUI build ###" + src=$(readlink -f $(dirname $0))/../../webui-src if [ "$1" = "" ]; then @@ -13,22 +15,32 @@ fi if [ "$2" = "" ]; then if [ -d "$publicdest" ]; then - echo remove existing $publicdest + echo removing existing $publicdest rm $publicdest -R fi fi if [ ! -d "$publicdest" ]; then - echo mkdir $publicdest + echo creating $publicdest mkdir $publicdest fi # For using recursive directory search(requires bash v4+) shopt -s globstar +if [ "$2" = "" ]||[ "$2" = "index.html" ]; then + echo copying html file + cp -r $src/index.html $publicdest/ +fi + +if [ "$2" = "" ]||[ "$2" = "styles.css" ]; then + echo copying css file + cp $src/styles.css $publicdest/ +fi + if [ "$2" = "" ]||[ "$2" = "app.js" ]; then echo building app.js: - echo - copy template.js ... + echo - copying template.js ... cp $src/make-src/template.js $publicdest/app.js js_source=$src/app/ @@ -43,29 +55,23 @@ if [ "$2" = "" ]||[ "$2" = "app.js" ]; then done fi -if [ "$2" = "" ]||[ "$2" = "app.css" ]; then - # copy css file generated by sass - echo copy styles folder - cp $src/styles/* $publicdest/ -fi - -if [ "$2" = "" ]||[ "$2" = "index.html" ]; then - echo copy assets folder - cp -r $src/assets/* $publicdest/ +if [ "$2" = "" ]||[ "$2" = "../data" ]; then + echo copying assets folder + cp -r $src/assets/* $publicdest/ fi if [ "$2" = "" ]||[ "$2" = "../data" ]; then # only for development to restore data folder - echo copy data folder + echo copying data folder mkdir $publicdest/data - cp -r $src/../data $publicdest/ + cp -r $src/../data $publicdest/ fi if [ "$2" != "" ]&&[ "$3" != "" ]; then if [ ! -d "$3/webui" ]; then - echo mkdir $3/webui + echo creating $3/webui mkdir $3/webui fi - echo copy $2 nach $3/webui/$2 + echo copying $2 nach $3/webui/$2 cp $publicdest/$2 $3/webui/$2 fi -echo build.sh complete +echo "### WebUI build complete ###" diff --git a/webui-src/make-src/init.bat b/webui-src/make-src/init.bat index bf7ab6d..5934283 100644 --- a/webui-src/make-src/init.bat +++ b/webui-src/make-src/init.bat @@ -4,12 +4,12 @@ REM create dummy webfiles at qmake run set publicdest=%1\webui if "%1" == "" set publicdest=..\..\webui -if exist %publicdest% echo remove %publicdest%&&rd %publicdest% /S /Q +if exist %publicdest% echo removing %publicdest%&&rd %publicdest% /S /Q -echo create %publicdest% +echo creating %publicdest% md %publicdest% -echo create %publicdest%\app.js, %publicdest%\app.css, %publicdest%\index.html +echo creating %publicdest%\app.js, %publicdest%\styles.css, %publicdest%\index.html echo. > %publicdest%\app.js -echo. > %publicdest%\app.css +echo. > %publicdest%\styles.css echo. > %publicdest%\index.html diff --git a/webui-src/make-src/init.sh b/webui-src/make-src/init.sh index e4b2e29..f847c1b 100755 --- a/webui-src/make-src/init.sh +++ b/webui-src/make-src/init.sh @@ -9,14 +9,14 @@ else fi if [ -d "$publicdest" ]; then - echo remove $publicdest + echo removing $publicdest rm $publicdest -R fi -echo create $publicdest +echo creating $publicdest mkdir $publicdest -echo touch $publicdest/app.js, $publicdest/app.css, $publicdest/index.html +echo creating $publicdest/app.js, $publicdest/styles.css, $publicdest/index.html touch $publicdest/app.js -d 1970-01-01 -touch $publicdest/app.css -d 1970-01-01 +touch $publicdest/styles.css -d 1970-01-01 touch $publicdest/index.html -d 1970-01-01 diff --git a/webui-src/package.json b/webui-src/package.json index 2a7b057..6525053 100644 --- a/webui-src/package.json +++ b/webui-src/package.json @@ -1,13 +1,11 @@ { "name": "webui-src", "version": "1.0.0", - "description": "", + "description": "Retroshare's Web Interface", "scripts": { - "watch": "rm ./styles/app.css && sass --watch --embed-sources --embed-source-map ./app/scss/main.scss ./styles/app.css", - "build": "sass --no-source-map --style=compressed ./app/scss/main.scss ./styles/app.css" + "watch": "rm ./styles/app.css && sass --watch --embed-sources --embed-source-map ./app/scss/main.scss ./styles.css", + "build": "sass --no-source-map --style=compressed ./app/scss/main.scss ./styles.css" }, - "keywords": [], - "author": "", "license": "ISC", "devDependencies": { "sass": "^1.60.0" diff --git a/webui-src/styles/app.css b/webui-src/styles.css similarity index 100% rename from webui-src/styles/app.css rename to webui-src/styles.css diff --git a/webui.pro b/webui.pro index 6e76147..6890def 100644 --- a/webui.pro +++ b/webui.pro @@ -21,7 +21,7 @@ TEMPLATE = subdirs SUBDIRS= # don't build anything CONFIG -= qt -WEBUI_SRC_HTML += $$PWD/webui-src/assets/index.html +WEBUI_SRC_HTML += $$PWD/webui-src/index.html WEBUI_SRC_JS = $$PWD/webui-src/app/rswebui.js WEBUI_SRC_JS += $$PWD/webui-src/app/mithril.js @@ -29,7 +29,7 @@ WEBUI_SRC_JS += $$PWD/webui-src/app/login.js WEBUI_SRC_JS += $$PWD/webui-src/app/main.js WEBUI_SRC_JS += $$PWD/webui-src/app/home.js -WEBUI_SRC_CSS += $$PWD/webui-src/styles/app.css +WEBUI_SRC_CSS += $$PWD/webui-src/styles.css WEBUI_SRC_DATA += $$PWD/data/retroshare.svg @@ -90,24 +90,18 @@ win32-g++ { create_webfiles_js.variable_out = JUNK create_webfiles_js.CONFIG = combine no_link - create_webfiles_css.output = webui/app.css + create_webfiles_css.output = webui/styles.css create_webfiles_css.input = WEBUI_SRC_CSS - create_webfiles_css.commands = sh $$_PRO_FILE_PWD_/webui-src/make-src/build.sh $$_PRO_FILE_PWD_ app.css . + create_webfiles_css.commands = sh $$_PRO_FILE_PWD_/webui-src/make-src/build.sh $$_PRO_FILE_PWD_ styles.css . create_webfiles_css.variable_out = JUNK create_webfiles_css.CONFIG = combine no_link QMAKE_EXTRA_COMPILERS += create_webfiles_html create_webfiles_js create_webfiles_css - system(cp -r data webui/) - - webui_css_files.path = "$${RS_DATA_DIR}/webui/css/" - webui_css_files.files = webui/css/fontawesome.css \ - webui/css/solid.css - webui_base_files.path = "$${RS_DATA_DIR}/webui/" - webui_base_files.files = webui/app.css \ - webui/app.js \ - webui/index.html + webui_base_files.files = webui/index.html \ + webui/styles.css \ + webui/app.js webui_data_files.path = "$${RS_DATA_DIR}/webui/data/" webui_data_files.files = webui/data/retroshare.svg \ @@ -120,5 +114,5 @@ win32-g++ { webui/webfonts/fa-solid-900.woff \ webui/webfonts/fa-solid-900.woff2 - INSTALLS += webui_base_files webui_css_files webui_font_files webui_data_files + INSTALLS += webui_base_files webui_font_files webui_data_files } From 078baef18dae345bea5cd506e160feaabc907d39 Mon Sep 17 00:00:00 2001 From: zelfroster Date: Tue, 22 Aug 2023 10:40:19 +0530 Subject: [PATCH 3/4] chore: remove data dir and move images to assets dir, update image paths --- data/streaming.png | Bin 1338 -> 0 bytes data/user.png | Bin 21886 -> 0 bytes webui-src/app/home.js | 2 +- webui-src/app/login.js | 2 +- webui-src/app/main.js | 2 +- .../assets/images}/retroshare.svg | 0 {data => webui-src/assets/images}/user.svg | 0 webui-src/index.html | 2 +- webui-src/make-src/build.bat | 3 --- webui-src/make-src/build.sh | 15 +++------------ webui.pro | 13 ++++++------- 11 files changed, 13 insertions(+), 26 deletions(-) delete mode 100644 data/streaming.png delete mode 100644 data/user.png rename {data => webui-src/assets/images}/retroshare.svg (100%) rename {data => webui-src/assets/images}/user.svg (100%) diff --git a/data/streaming.png b/data/streaming.png deleted file mode 100644 index 02eafda3cdbdaf56492c647199a78f7ef462d5fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1338 zcmV-A1;zS_P)3_}W_I?_-EF&cn>|QRv}JpMQb4dGaN1@;&d> zM<}Iu5W_qW>;F>B-S5Gc=borhsZ`aJ5F3+LYQQn>v@8=@rZY61o(V@HJ;#5!GDsSi zFWbPdWTw5RzyIH)o1a}jJnsuRGPD|*Rk0;$F*y~82%on148Cd0H0i1;3+eHM)%K zjT$xoB~f#FMM`~9TAaUa+&P0lB!aP1O~u&K~e71YuHO+39j9T=a~KjOB0`; z9vPT+j?+|l$`qczQ_$8ij9A!@w67nWr3N}x5{(a6qxR7!;f$5y=gTexTAB_)uhB%p zLR{${8t_Z8NUUQZJQ+;TQ>$LSwAo@bP)cbFrSwEZR1S{^)5`7nBz@+scDkYQ0;ME2?L7OOMP;=V=?v|Y*Fm_h2VJ>pX^wVph(f)^(UsiQ)oVO5xi+3 zWQCxy-Ue9#7zR`}o6We=+skTr4dd*cz?27cE-Xn&Spmz+Xg+x!Dw;t9Q3al$i0TSE zKq-R00F)F1F-9DOZd4_wI+$Xn^2$Vr1NdBc}$COv!036A)+r_|aHk ze0r&zlwu7v7OmER>Egnr$<_lDr_YZ?YwMd5G8M%ls|7=D3Ef>z@C<|LnJ65k%Mgx4 zP*Tx=4BJC6Xn`LNNg9r-`7>vKI`L6k>xnBGp0~6d`C#|zRjao-%9a?^3Waxku%U8! zgMZfVNp5PYClv~h@*)#1e4j+`H4iGvAH((0E;!1J5MzEgM~;96sUsZ7ah7GObsV3U zmPHax(~lWo7YpzyV7H#dySZA8$}iLLBI|>y5@kJdkP6Hjt`{Lc~O1&g(_K zJqPpN5CY)@(hTGYk8hR&J4sDRA^+mmeW^EI+d$XUEh9rCVvKw+Tc8Z36l<$1Rrg!+%8ql)rnS|~U%ckY6uBt6-v9sr07*qoM6N<$g0@s<*Z=?k diff --git a/data/user.png b/data/user.png deleted file mode 100644 index 1db461c643c218d3a46e71987d119363cded686e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21886 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 { view() { return m('.logo', [ m('img', { - src: '../data/retroshare.svg', + src: 'images/retroshare.svg', alt: 'retroshare_icon', }), m('.retroshareText', [ diff --git a/webui-src/app/login.js b/webui-src/app/login.js index 6251466..dd2d24a 100644 --- a/webui-src/app/login.js +++ b/webui-src/app/login.js @@ -39,7 +39,7 @@ function loginComponent() { let withOptions = false; const logo = () => - m('img.logo[width=30%]', { src: '../data/retroshare.svg', alt: 'retroshare_icon' }); + m('img.logo[width=30%]', { src: 'images/retroshare.svg', alt: 'retroshare_icon' }); const inputName = () => m('input', { diff --git a/webui-src/app/main.js b/webui-src/app/main.js index 070551a..fba7d8c 100644 --- a/webui-src/app/main.js +++ b/webui-src/app/main.js @@ -37,7 +37,7 @@ const navbar = () => { [ m('.nav-menu__logo', [ m('img', { - src: '../data/retroshare.svg', + src: 'images/retroshare.svg', alt: 'retroshare_icon', }), m('h5', 'Retroshare'), diff --git a/data/retroshare.svg b/webui-src/assets/images/retroshare.svg similarity index 100% rename from data/retroshare.svg rename to webui-src/assets/images/retroshare.svg diff --git a/data/user.svg b/webui-src/assets/images/user.svg similarity index 100% rename from data/user.svg rename to webui-src/assets/images/user.svg diff --git a/webui-src/index.html b/webui-src/index.html index 74d35c7..a232168 100644 --- a/webui-src/index.html +++ b/webui-src/index.html @@ -5,7 +5,7 @@ RetroShare - + diff --git a/webui-src/make-src/build.bat b/webui-src/make-src/build.bat index af06cd6..62f4e0e 100644 --- a/webui-src/make-src/build.bat +++ b/webui-src/make-src/build.bat @@ -42,9 +42,6 @@ popd echo copying assets folder xcopy /s %src%\assets\ %publicdest% -echo copying data folder -xcopy /s %src%\..\data %publicdest%\data\ - echo "### WebUI build complete ###" goto :EOF diff --git a/webui-src/make-src/build.sh b/webui-src/make-src/build.sh index 4b5dbf0..7b045c8 100755 --- a/webui-src/make-src/build.sh +++ b/webui-src/make-src/build.sh @@ -13,7 +13,6 @@ else fi if [ "$2" = "" ]; then - if [ -d "$publicdest" ]; then echo removing existing $publicdest rm $publicdest -R @@ -30,7 +29,7 @@ shopt -s globstar if [ "$2" = "" ]||[ "$2" = "index.html" ]; then echo copying html file - cp -r $src/index.html $publicdest/ + cp -r $src/index.html $publicdest/ fi if [ "$2" = "" ]||[ "$2" = "styles.css" ]; then @@ -55,16 +54,8 @@ if [ "$2" = "" ]||[ "$2" = "app.js" ]; then done fi -if [ "$2" = "" ]||[ "$2" = "../data" ]; then - echo copying assets folder - cp -r $src/assets/* $publicdest/ -fi - -if [ "$2" = "" ]||[ "$2" = "../data" ]; then # only for development to restore data folder - echo copying data folder - mkdir $publicdest/data - cp -r $src/../data $publicdest/ -fi +echo copying assets folder +cp -r $src/assets/* $publicdest/ if [ "$2" != "" ]&&[ "$3" != "" ]; then if [ ! -d "$3/webui" ]; then diff --git a/webui.pro b/webui.pro index 6890def..25c8f77 100644 --- a/webui.pro +++ b/webui.pro @@ -21,7 +21,7 @@ TEMPLATE = subdirs SUBDIRS= # don't build anything CONFIG -= qt -WEBUI_SRC_HTML += $$PWD/webui-src/index.html +WEBUI_SRC_HTML = $$PWD/webui-src/index.html WEBUI_SRC_JS = $$PWD/webui-src/app/rswebui.js WEBUI_SRC_JS += $$PWD/webui-src/app/mithril.js @@ -29,9 +29,9 @@ WEBUI_SRC_JS += $$PWD/webui-src/app/login.js WEBUI_SRC_JS += $$PWD/webui-src/app/main.js WEBUI_SRC_JS += $$PWD/webui-src/app/home.js -WEBUI_SRC_CSS += $$PWD/webui-src/styles.css +WEBUI_SRC_CSS = $$PWD/webui-src/styles.css -WEBUI_SRC_DATA += $$PWD/data/retroshare.svg +WEBUI_SRC_IMAGE = $$PWD/data/retroshare.svg win32-g++ { isEmpty(QMAKE_SH) { @@ -103,9 +103,8 @@ win32-g++ { webui/styles.css \ webui/app.js - webui_data_files.path = "$${RS_DATA_DIR}/webui/data/" - webui_data_files.files = webui/data/retroshare.svg \ - webui/data/streaming.png + webui_image_files.path = "$${RS_DATA_DIR}/webui/images/" + webui_image_files.files = webui/images/retroshare.svg webui_font_files.path = "$${RS_DATA_DIR}/webui/webfonts/" webui_font_files.files = webui/webfonts/fa-solid-900.eot \ @@ -114,5 +113,5 @@ win32-g++ { webui/webfonts/fa-solid-900.woff \ webui/webfonts/fa-solid-900.woff2 - INSTALLS += webui_base_files webui_font_files webui_data_files + INSTALLS += webui_base_files webui_font_files webui_image_files } From 85d24baecc69c931a1c3b4aaff63eeb8efdbd070 Mon Sep 17 00:00:00 2001 From: zelfroster Date: Tue, 22 Aug 2023 13:22:26 +0530 Subject: [PATCH 4/4] chore: update readme --- webui-src/make-src/README.md | 5 +++++ webui-src/make-src/readme.md | 7 ------- 2 files changed, 5 insertions(+), 7 deletions(-) create mode 100644 webui-src/make-src/README.md delete mode 100644 webui-src/make-src/readme.md diff --git a/webui-src/make-src/README.md b/webui-src/make-src/README.md new file mode 100644 index 0000000..515993a --- /dev/null +++ b/webui-src/make-src/README.md @@ -0,0 +1,5 @@ +**This folder contains files needed to create webfiles at compile-time and qmake** + +* init.sh creates dummy files at qmake +* build.sh creates files at compile time +* template.js start of compiled app.js, containing additional created content diff --git a/webui-src/make-src/readme.md b/webui-src/make-src/readme.md deleted file mode 100644 index 1fa2016..0000000 --- a/webui-src/make-src/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -this folder contains files needed to create webfiles at compile-time and qmake - -* init.sh creates dummy files at qmake -* build.sh creates files at compile time -* chat.css compiled version of _chat.sass (.sass should replaced by .scss) -* main.css simple template extracted from main.sass -* template.js start of compiled app.js, containing additional created content