summit-2024-web

Month: 2023-08

2023-08-26

RS 11:36:03
@rschiang has joined the channel
Dong 11:36:17
@ay870527 has joined the channel
sean076 11:36:34
@sean076 has joined the channel
saul511 11:36:34
@saul511 has joined the channel
RS 11:40:15
set the channel description: g0v summit 2024 網站小組
RS 11:52:34
https://github.com/g0v/summit2024

g0v/summit2024

Official website of g0v Summit 2024

RS 11:52:55
CFP link: `https://summit.g0v.tw/2024/cfp/` (還未實作)
Dong 12:15:32
summit-2020 使用 grantdash 的紀錄:https://g0v.hackmd.io/@summit2020/summit-2020-cfp-wg/%2F_cq0vACmQ1CduPciHIkaNA

HackMD

CFP 宣傳企劃區(議程組x宣傳組) - HackMD

# CFP 宣傳企劃區(議程組x宣傳組) ## 背景資料區 ### 時程(依照2020.05.17總籌組會議) 5/28(四) Facebook 預告 + Twitter 預告 6/4 (四

pm5 13:01:51
@pm5 has joined the channel
shibasalmon 13:19:17
@shibasalmon has joined the channel
yanyiyi 13:23:34
@yanyiyi has joined the channel
yanyiyi 13:27:37
來自 @denny
關鍵是他
用他產 json
https://github.com/CCIP-App/schedule-json-generator
(可以用 google sheet 產)

CCIP-App/schedule-json-generator

yanyiyi 13:27:37
來自 @denny
關鍵是他
用他產 json
https://github.com/CCIP-App/schedule-json-generator
(可以用 google sheet 產)
yanyiyi 13:29:03
吃 pretalx API 轉成那個格式
https://github.com/COSCUP/2023/blob/master/scripts/pre-build/generateSession.ts

<https://github.com/COSCUP/2023/blob/master/scripts/pre-build/generateSession.ts | generateSession.ts>

``` /* eslint-disable camelcase */ import axios from 'axios' import md5 from 'js-md5' import { saveJSON } from './utils' import { join, dirname } from 'path' import { fileURLToPath } from 'url' import dotenv from 'dotenv' import CO_WRITE_MAP from './hackmd_url_mappings.json' dotenv.config() dotenv.config({ path: join(dirname(fileURLToPath(import.meta.url)), '../../.env.local') }) const pretalxOptions = { headers: { Authorization: `Token ${process.env.PRETALX_TOKEN}` } } const SPEAKER_ZH_NAME_ID = 0 const SPEAKER_ZH_BIO_ID = 0 const SPEAKER_EN_NAME_ID = 0 const SPEAKER_EN_BIO_ID = 70 const SESSION_ZH_DESCRIPTION_ID = 0 const SESSION_EN_TITLE_ID = 71 const SESSION_EN_DESCRIPTION_ID = 69 const SESSION_TAGS_ID = 27 const SESSION_CO_WRITE_ID = 0 const SESSION_QA_ID = 0 const SESSION_SLIDE_ID = 0 const SESSION_RECORD_ID = 2098 const filterUnknownChar = (s: string) => s.replaceAll('\u2028', '\n') function genResult (talks, rooms, speakers) { function getAnswer<T extends { answers: Array<{ question: { id: number }, answer: string }>, [name: string]: string | any }> ( data: T, id: number, fallback: string | null ): string | null { const answer = data.answers.find((a :any) => a.question.id === id)?.answer return (!answer || answer === '-') ? fallback : answer } const resRooms = rooms.results .map(r => { return { id: r.name.en || r.name['zh-tw'], zh: { name: r.name['zh-tw'] }, en: { name: r.name.en || r.name['zh-tw'] } } }) const resSpeakers = speakers.results.map(s => { return { id: s.code, avatar: s.avatar || `<https://www.gravatar.com/avatar/${md5(s.email)}?s=1024&d=identicon&r=g>`, zh: { name: getAnswer(s, SPEAKER_ZH_NAME_ID, s.name), bio: filterUnknownChar(getAnswer(s, SPEAKER_ZH_BIO_ID, s.biography || '-')) }, en: { name: getAnswer(s, SPEAKER_EN_NAME_ID, s.name), bio: filterUnknownChar(getAnswer(s, SPEAKER_EN_BIO_ID, s.biography || '-')) } } }) const tracks = talks.results.map(s => s.track).filter((t, i, s) => i === s.findIndex(tt => tt?.['zh-tw'] === t?.['zh-tw'] && tt?.en === t?.en)) const resSessionTypes = tracks .map(t => { return { id: Math.random().toString(36).substring(2, 8), zh: { name: t?.['zh-tw'] || t?.en || 'main' }, en: { name: t?.en || t?.['zh-tw'] || 'main' } } }) const resTags = [ { id: 'Prime', zh: { name: 'Prime session' }, en: { name: 'Prime session' } }, { id: 'Beginner', zh: { name: '入門' }, en: { name: 'Beginner' } }, { id: 'Skilled', zh: { name: '中階' }, en: { name: 'Skilled' } }, { id: 'Advance', zh: { name: '進階' }, en: { name: 'Advance' } }, { id: 'zh-tw', zh: { name: '中文' }, en: { name: 'Chinese' } }, { id: 'en', zh: { name: 'English' }, en: { name: 'English' } }, { id: 'ja-JP', zh: { name: '日本語' }, en: { name: 'Japanese' } } ] const getLanguage = (locale: string) => { return resTags.find((t) => t.id === locale)?.zh?.name ?? 'English' } const resSessions = talks.results.map((s :any) => { return { id: s.code, type: resSessionTypes.find((t :any) => s.track?.['zh-tw'] === t.zh.name || s.track?.en === t.en.name)?.id ?? resSessionTypes.find((t :any) => t.zh.name === 'main')?.id, room: s.slot.room?.en || s.slot.room?.['zh-tw'], start: s.slot.start, end: s.slot.end, language: getLanguage(s.content_locale), zh: { title: s.title, description: getAnswer(s, SESSION_ZH_DESCRIPTION_ID, s.abstract || '') }, en: { title: getAnswer(s, SESSION_EN_TITLE_ID, s.title), description: getAnswer(s, SESSION_EN_DESCRIPTION_ID, s.abstract || '') }, speakers: s.speakers.map(ss => ss.code), tags: [s.content_locale] .concat(s.answers.find(a => a.question.id === SESSION_TAGS_ID) !== undefined ? [s.answers.find(a => a.question.id === SESSION_TAGS_ID).options[0].answer.en] : []) .concat(s.tags?.includes('prime session') ? ['Prime'] : []), // co_write: getAnswer(s, SESSION_CO_WRITE_ID, null), co_write: CO_WRITE_MAP?.[s.code as keyof typeof CO_WRITE_MAP]?.URL || null, qa: getAnswer(s, SESSION_QA_ID, null), slide: getAnswer(s, SESSION_SLIDE_ID, null), record: getAnswer(s, SESSION_RECORD_ID, null), uri: `<https://coscup.org/2023/session/${s.code}>` } }) return { sessions: resSessions, speakers: resSpeakers, session_types: resSessionTypes, rooms: resRooms, tags: resTags } } export default async function run () { let data = {} try { const results = await Promise.all([ axios.get('<https://pretalx.coscup.org/api/events/coscup-2023/talks/?limit=500>', pretalxOptions), axios.get('<https://pretalx.coscup.org/api/events/coscup-2023/rooms/?limit=500>', pretalxOptions), axios.get('<https://pretalx.coscup.org/api/events/coscup-2023/speakers/?limit=500>', pretalxOptions) ]) data = genResult(results[0].data, results[1].data, results[2].data) } catch (e) { console.error(e) const { data: d } = await axios.get('<https://coscup.org/2023/json/session.json>') data = d } saveJSON('session', data) } ```

RS 15:33:34
@denny 你要不要解釋一下 OPass 怎麼用XD
RS 15:33:34
@denny 你要不要解釋一下 OPass 怎麼用XD
🙏 1
yanyiyi 15:48:16
@sean076 AI 檔~
SUMMIT穿山甲.ai
1 4
stella 21:30:12
@stella has joined the channel
Skyler 23:25:02
@fufu1314 has joined the channel

2023-08-29

sean076 15:21:58
@ay870527 @fufu1314 Heyy~想詢問 CFP 的頁面 figma :)))
嗨嗨,我想等今晚議程組開完會,確定網站上要放的東西後,再把最終版文字更新上去~
讚讚你們好棒~
sean076 15:21:58
@ay870527 @fufu1314 Heyy~想詢問 CFP 的頁面 figma :)))
嗨嗨,我想等今晚議程組開完會,確定網站上要放的東西後,再把最終版文字更新上去~
讚讚你們好棒~
paulpengtw 21:48:40
@paulpengtw has joined the channel

2023-08-30

Dong 22:02:17
@sean076 回報一下,我今天(剛剛)有新增另一版的 landing page,另外,在 Figma 文件下方有蒐集一些用 Grantdash 的網頁排版可以參考,再麻煩看一下囉~

https://www.figma.com/file/GyTPa3fixfTO4OkLA90Wba/summit-2024
感恩讚嘆,會漂浮感覺很有趣!不知道能不能用 Google Forms + Google Sheet as JSON 實作,這樣就不用伺服器了(・ω・)
是說 @ay870527 你用的是台灣道路體,但台灣道路體不能用在網頁上哦XD 要放在網頁上要轉外框上去
先這樣XD.....明天繼續
https://g0v.github.io/summit2024/
好讚喔!!
太厲害了!!
Dong 22:02:17
@sean076 回報一下,我今天(剛剛)有新增另一版的 landing page,另外,在 Figma 文件下方有蒐集一些用 Grantdash 的網頁排版可以參考,再麻煩看一下囉~

v2 版功能許願:
• 希望可以讓使用者在上方輸入對 summit2024 的想法,然後這些想法可以漂浮在頁面上方。
• 倒數天數可以真的倒數。
• 「我想一起籌備Summit」按鈕可以連結至 summut 2024 hackmd 共筆
• 「我要投稿」按鈕可以連結至Grantdash投稿頁面(不確定會怎麼做,所以先放一個開新分頁的icon)
小提醒:
• figma 裡面使用的 icon 來自 bootstrap icon
https://www.figma.com/file/GyTPa3fixfTO4OkLA90Wba/summit-2024

Figma

summit-2024

Created with Figma

感恩讚嘆,會漂浮感覺很有趣!不知道能不能用 Google Forms + Google Sheet as JSON 實作,這樣就不用伺服器了(・ω・)
是說 @ay870527 你用的是台灣道路體,但台灣道路體不能用在網頁上哦XD 要放在網頁上要轉外框上去
先這樣XD.....明天繼續
https://g0v.github.io/summit2024/
好讚喔!!
太厲害了!!
1

2023-08-31

sean076 19:06:04
先這樣XD.....明天繼續
https://g0v.github.io/summit2024/
🙌 2 1 👍 1